【问题标题】:Load independent assembly in a another App Domain在另一个应用程序域中加载独立程序集
【发布时间】:2010-06-28 21:45:07
【问题描述】:

简单的问题,你可能很容易回答。

我的应用程序的同一输出文件夹中有一个名为“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

.

为什么?

感谢您的宝贵时间。

【问题讨论】:

  • 您能否启用 Fusion 记录器并查看第一个正在寻找什么以及在哪里?
  • 没有必要,解决方案就是答案。感谢您的宝贵时间。
  • 只想指出,此代码将加载到主 AppDomain 并在应用程序的生命周期内锁定目标程序集。为防止这种情况(并实际卸载目标),您需要创建一个动态加载的代理对象,动态加载目标(此代码),最后将可序列化数据(如果需要)打乱回调用应用程序。

标签: c# .net assemblies appdomain


【解决方案1】:

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

【讨论】:

  • 已经完成(对于 PrivateBinPath),请查看第 2 行。但你也是对的,非常感谢。
【解决方案2】:

appDomain.Load(string) 接受程序集名称(强名称) - 不是文件在磁盘上的路径!

【讨论】:

  • +1。我猜它期望程序集的显示名称可能是也可能不是完整的强名称 - 但你是对的,它不会接受路径。
  • 没错,非常感谢。需要给code4life的答案,他先给出了好的答案。
  • 不用担心 - 很高兴您现在一切就绪!
猜你喜欢
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
  • 2014-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多