c# – 将程序集加载到AppDomain中
发布时间:2020-12-15 17:25:40 所属栏目:百科 来源:网络整理
导读:如果我使用 Assembly assembly = Assembly.LoadFrom(file); 然后尝试使用该文件,我得到一个异常,说明该文件正在使用中. 我需要将它加载到一个新的appdomain. 我似乎找到的是如何在Assembly中创建实例的示例, 有没有办法加载整个装配. 我需要的是: (1) load
如果我使用
Assembly assembly = Assembly.LoadFrom(file); 然后尝试使用该文件,我得到一个异常,说明该文件正在使用中. 我需要将它加载到一个新的appdomain. 我似乎找到的是如何在Assembly中创建实例的示例, 我需要的是: (1) load the assembly into a new AppDomain from a file . (2) extract an embedded resource (xml file) from the Dll . (3) extract a type of class which implements an interface (which i know the interface type) . (4) unload the entire appdomain in order to free the file . 2-4不是问题 我似乎无法找到如何将程序集加载到一个新的AppDomin,只有例子 我需要整个事情. 喜欢这个问题:Create实例的另一个例子. Loading DLLs into a separate AppDomain 解决方法
最基本的多域方案是
static void Main() { AppDomain newDomain = AppDomain.CreateDomain("New Domain"); newDomain.ExecuteAssembly("file.exe"); AppDomain.Unload(newDomain); } 在单独的域上调用ExecuteAssembly是方便的,但不提供与域本身交互的能力.它还要求目标程序集是可执行文件,并强制调用者进入单个入口点.要结合一些灵活性,您还可以将字符串或args传递给.exe. 我希望这有帮助. 扩展:尝试类似下面的内容 AppDomainSetup setup = new AppDomainSetup(); setup.AppDomainInitializer = new AppDomainInitializer(ConfigureAppDomain); setup.AppDomainInitializerArguments = new string[] { unknownAppPath }; AppDomain testDomain = AppDomain.CreateDomain("test",AppDomain.CurrentDomain.Evidence,setup); AppDomain.Unload(testDomain); File.Delete(unknownAppPath); AppDomain可以在哪里初始化,如下所示 public static void ConfigureAppDomain(string[] args) { string unknownAppPath = args[0]; AppDomain.CurrentDomain.DoCallBack(delegate() { //check that the new assembly is signed with the same public key Assembly unknownAsm = AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(unknownAppPath)); //get the new assembly public key byte[] unknownKeyBytes = unknownAsm.GetName().GetPublicKey(); string unknownKeyStr = BitConverter.ToString(unknownKeyBytes); //get the current public key Assembly asm = Assembly.GetExecutingAssembly(); AssemblyName aname = asm.GetName(); byte[] pubKey = aname.GetPublicKey(); string hexKeyStr = BitConverter.ToString(pubKey); if (hexKeyStr == unknownKeyStr) { //keys match so execute a method Type classType = unknownAsm.GetType("namespace.classname"); classType.InvokeMember("MethodNameToInvoke",BindingFlags.InvokeMethod,null,null); } }); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |