在另一个应用程序域加载独立程序集

问题描述:

简单的问题,可能很容易让您回答。在另一个应用程序域加载独立程序集

我在我的应用程序的同一输出文件夹中有一个名为“MigrationSteps.dll”的dll。 我想要做的是,将该程序集加载到新的AppDomain中,并在该DLL内部的类的实例上执行方法。

这里是我的代码

 string migrationStepsDllPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "MigrationSteps.dll"); 
     AppDomainSetup appDomainSetup = new AppDomainSetup() { PrivateBinPath = AppDomain.CurrentDomain.BaseDirectory }; 
     Evidence evidence = AppDomain.CurrentDomain.Evidence; 

     AppDomain appDomain = AppDomain.CreateDomain("MigrationAppDomain", evidence, appDomainSetup); 

//NOT WORKING 
     Assembly assembly = appDomain.Load(@"C:\Output\Debug\OptimeToolbench\MigrationSteps.dll"); 

     //WORKING 
     Assembly assembly = Assembly.LoadFrom(@"C:\Output\Debug\OptimeToolbench\MigrationSteps.dll"); ****works. 

     //This part works well 
     Type type = assembly.GetType("MigrationSteps.Foo"); 
     object foo = Activator.CreateInstance(type); 
     MethodInfo methodInfo = type.GetMethod("HelloWorld"); 
     methodInfo.Invoke(foo, null); 
     AppDomain.Unload(appDomain); 

每次行表示为工作不抛出一个

FileNotFoundException异常

这是为什么?

感谢您的时间。

+0

你可以启用Fusion记录器,看看第一个在寻找什么? – 2010-06-28 21:55:25

+0

这将不是必要的,解决方案就是答案。谢谢你的时间。 – esylvestre 2010-06-29 12:13:21

+0

只是想指出,此代码将加载到主AppDomain中,并在应用程序的整个生命周期中锁定目标程序集。为了防止(并实际卸载目标),您需要创建一个动态加载的代理对象,动态加载目标(此代码),最后再将可序列化的数据(如果需要的话)洗牌回调用应用程序。 – JoeBrockhaus 2014-12-05 21:24:19

将“C:\ Output \ Debug \ OptimeToolbench \”添加到AppDomain的PrivateBinPath。也不要传入文件名,传入程序集名称 - 我假设这将是MigrationSteps。

+1

已经完成(对于PrivateBinPath),请查看第2行。 但你也是对的,非常感谢你。 – esylvestre 2010-06-29 12:08:42

+0

哎呀,对不起人!但很高兴你解决了它! – code4life 2010-06-29 13:09:24

appDomain.Load(string)需要一个程序集名称(强名称) - 不是磁盘上文件的路径!

+0

+1。我想它会期望程序集的显示名称,它可能是或可能不是完整的强名称 - 但你是正确的,它不会接受路径。 – 2010-06-28 22:18:39

+0

没错,非常感谢。 需要给出code4life的答案,他先回答好答案。 – esylvestre 2010-06-29 12:10:53

+1

不用担心 - 很高兴你现在都准备好了! – 2010-06-29 15:56:46