CreateInstanceAndUnwrap无法加载程序集

时间:2013-04-08 15:28:28

标签: c# reflection appdomain

我正在尝试在我的控制台应用程序中的新AppDomain中加载程序集A,其中包含相同的基目录和RelativePath作为默认域。

当我使用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);

以下是错误消息:

  

无法加载文件或程序集'.. \ Mytypes \ A.dll'或其中一个依赖项。给定的程序集名称或代码库无效。 (来自HRESULT的异常:0x80131047)`

1 个答案:

答案 0 :(得分:15)

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

它与CreateInstanceFromAndUnwrap方法一起使用的原因是LoadFrom上下文将尝试解析Mytypes文件夹中的程序集。 Load上下文不会。它将尝试仅从AppDomain的GAC,BaseDirectory和RelativeSearchPath解析。

您拥有的一些选项是:

  1. 使用LoadFrom上下文(使用CreateInstanceFromXXX方法)。
  2. 将Mytypes文件夹添加到用于创建AppDomain的AppDomainSetup.PrivateBinPath。这样,Load上下文将能够解析位于那里的assebmlies。
  3. 订阅AppDomain.AssemblyResolve事件并自行解决程序集,方法是查找它们并从Mytypes文件夹中加载它们。
  4. 将所有程序集部署到应用程序的基本目录中。
  5. 我建议使用2选项,它将允许您想要的文件夹结构以及通常优先选择的Load上下文。