CreateInstanceAndUnwrap加载程序集失败



我试图在控制台应用程序的新AppDomain中加载程序集A,其基本目录和相对路径与默认域相同。

当我使用CreateInstanceFrom从a创建类型时,它成功了,但当我使用CreateInstanceAndUnwrap时,它无法找到FileLoadException的汇编文件。请记住,程序集A.MyType在其构造函数中调用程序集B.Typeb的方法。两个程序集文件都位于执行程序集的父文件夹(..Mytypes)的同一路径

_domain = AppDomain.CreateDomain("MyDomain" + Guid.NewGuid(), null, AppDomain.CurrentDomain.SetupInformation);
var mytype = _domain.CreateInstanceAndUnwrap(pathtoassembly, typename);

错误信息如下:

无法加载文件或程序集"..MytypesA.dll"或其依赖项之一。给定的程序集名称或代码库无效。(Exception from HRESULT: 0x80131047) '

AppDomain。CreateInstanceAndUnwrap将在load上下文中加载程序集,而AppDomain。CreateInstanceFromAndUnwrap将在LoadFrom上下文中加载程序集。

它与CreateInstanceFromAndUnwrap方法一起工作的原因是LoadFrom上下文将尝试解析Mytypes文件夹中的程序集。Load上下文则不会。它将尝试只从GAC、BaseDirectory和AppDomain的RelativeSearchPath进行解析。

你有一些选项:

  1. 使用LoadFrom上下文(通过使用CreateInstanceFromXXX方法)
  2. 添加Mytypes文件夹到AppDomainSetup。PrivateBinPath用于创建AppDomain。这样Load上下文就能够解析位于那里的程序集。
  3. 订阅AppDomain。AssemblyResolve事件,并通过查找程序集并从Mytypes文件夹加载它们来自己解析程序集。
  4. 将所有程序集部署到应用程序的基目录中。

我建议使用2选项,它将允许您想要的文件夹结构加上Load上下文,这通常是首选的选择。

相关内容

最新更新