我试图在控制台应用程序的新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进行解析。
你有一些选项:
- 使用LoadFrom上下文(通过使用CreateInstanceFromXXX方法)
- 添加Mytypes文件夹到AppDomainSetup。PrivateBinPath用于创建AppDomain。这样Load上下文就能够解析位于那里的程序集。
- 订阅AppDomain。AssemblyResolve事件,并通过查找程序集并从Mytypes文件夹加载它们来自己解析程序集。
- 将所有程序集部署到应用程序的基目录中。
我建议使用2选项,它将允许您想要的文件夹结构加上Load上下文,这通常是首选的选择。