CreateInstanceAndUnwrap无法加载程序集
我正尝试在我的控制台应用程序中的新AppDomain中加载程序集A,该程序具有与默认域相同的基本目录和RelativePath。CreateInstanceAndUnwrap无法加载程序集
当我使用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)`
AppDomain.CreateInstanceAndUnwrap将加载组件在加载上下文而AppDomain.CreateInstanceFromAndUnwrap将在LoadFrom上下文加载组件。
它使用CreateInstanceFromAndUnwrap方法的原因是LoadFrom上下文将尝试解析Mytypes文件夹中的程序集。 Load上下文不会。它将尝试仅解析来自AppDomain的GAC,BaseDirectory和RelativeSearchPath。
你们中有些人有三种选择:
- 使用LoadFrom上下文(通过使用CreateInstanceFromXXX方法)。
- 将Mytypes文件夹添加到用于创建AppDomain的AppDomainSetup.PrivateBinPath。这样负载上下文将能够解析位于那里的组件。
- 订阅AppDomain.AssemblyResolve事件并通过查找它们并从Mytypes文件夹加载它们来自己解析程序集。
- 将所有程序集部署到应用程序的基本目录中。
我建议2选项,它将允许您想要的文件夹结构加上通常是优先选择的加载上下文。
我尝试了#2的CreateInstanceAndUnwrap,并且它仍然在执行程序集的基本目录中查看日志中给出的内容。但是,当我尝试CreateInstanceFromAndUnwrap它工作得很好。仍然有一个由assemblyName参数创建的混淆,它实际上是指文件名,它的路径不是程序集名称。 – iamadnan 2013-04-09 12:41:30
'CreateInstanceAndUnwrap'将程序集名称作为第一个参数,而不是程序集的路径。此外,路径'.. \ MyTypes'位于应用程序基目录之外,因此在探测程序集时不会使用它。 – 2013-04-08 15:54:46
你将不得不用你从Fuslogvw.exe得到的跟踪来记录你的问题。 – 2013-04-08 17:34:17