CreateInstanceAndUnwrap 无法加载程序集

Posted

技术标签:

【中文标题】CreateInstanceAndUnwrap 无法加载程序集【英文标题】:CreateInstanceAndUnwrap fails to load assembly 【发布时间】:2013-04-08 15:28:27 【问题描述】:

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

【问题讨论】:

CreateInstanceAndUnwrap 将程序集名称作为第一个参数,而不是程序集的路径。此外,..\MyTypes 路径位于应用程序基目录之外,因此在探测程序集时不使用它。 您必须使用从 Fuslogvw.exe 获得的跟踪记录您的问题 【参考方案1】:

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

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

您有一些选择:

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

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

【讨论】:

我用 CreateInstanceAndUnwrap 尝试了#2,它仍然在日志中给出的执行程序集的基本目录中查找。但是,当我使用 CreateInstanceFromAndUnwrap 尝试它时,它工作得很好。仍然存在由 assemblyName 参数造成的混淆,它实际上是指文件名,它的路径不是程序集名称。 如果为PrivateBinPath 指定的目录不在ApplicationBase 下,则它们将被忽略。

以上是关于CreateInstanceAndUnwrap 无法加载程序集的主要内容,如果未能解决你的问题,请参考以下文章

CreateInstanceAndUnwrap 在另一个域中?

ASP.NET:CreateDomain(...).CreateInstanceAndUnwrap(...) 或 Assembly.LoadFrom(...).GetExportedTypes() 抛

AppDomain.CreateInstanceAndUnwrap 在网站中不起作用

使用 AppDomain.CreateInstanceAndUnwrap 创建类型 T 的实例,然后提前绑定到类型 T 的方法

AppDomain CreateInstanceAndUnwrap:类型未标记为可序列化

如果库的名称已更改,AppDomain.CreateInstanceAndUnwrap 将失败