6

我正在尝试在我的控制台应用程序的新 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)`

4

1 回答 1

16

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

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

您拥有的一些选项是:

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

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

于 2013-04-09T09:14:26.333 回答