在新的AppDomain

时间:2017-10-06 13:32:47

标签: c# .net powershell clr assemblies

我希望它不会重复,我看到很多类似的问题,但是他们中的任何一个都无法帮助我。

我在 nameofdll.dll 中有这样的方法代码:

    DllMethod()
    {
       Assembly assembly = Assembly.GetExecutingAssembly();
       Type type = assembly.GetType("Class");
       MethodInfo method = type.GetMethod("Method");
       object obj = Activator.CreateInstance(type);
       method.Invoke(...);
    }

和Class - 构造函数添加AssemblyResolver

   class Class
   {
      public Class()
      {
         AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);
      }
      public void Method()
      {...}
      private Assembly MyResolveEventHandler(object sender, ResolveEventArgs args)
      {...}
   }

直到我从我的主app.exe调用metod时调用 AssemblyResolver ,该app.exe与 nameofdll.dll 位于同一文件夹中,让我们将该文件夹命名为 mainfolder 以及PowerShell脚本以这种方式:

load dll(mainfolder + nameofdll.dll)
call DllMethod()

一切正常,但我必须卸载AssemblyResolver加载的dll,因为Method被多次调用不同的dll版本。

所以我修改了DllMethod():

{
   Assembly assembly = Assembly.GetExecutingAssembly();
   MethodInfo method = type.GetMethod("Method");
   //new part
   AppDomainSetup domainSetup = new AppDomainSetup();
   domainSetup.ApplicationBase = Path.GetDirectoryName(assembly.Location);
   AppDomain  Domain = AppDomain.CreateDomain(Class, null, domainSetup);
   object obj = Domain.CreateInstanceAndUnwrap(assembly.FullName, Class);
   method.Invoke(...);
   AppDomain.Unload(Domain);
}

我用      domainSetup.ApplicationBase = Path.GetDirectoryName(assembly.Location); 因为BaseDirecotry是powershell文件夹而CreateInstanceAndUnwrap无法找到nameofdll.dll。

最后问题是,当使用app.exe时,每个人都可以,但是当我从powershell脚本调用那个dll方法时,没有调用AssemblyResolver,我立刻得到错误,它无法加载一些dll。

我还尝试复制域名设置,然后添加

AppDomainSetup domainSetup = AppDomain.CurrentDomain.SetupInformation;

其中CurrentDomain是AssemblyResolver之前正常工作的域,但它没有解决问题。

0 个答案:

没有答案