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 的方法