2013-04-08 156 views
5

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

+1

'CreateInstanceAndUnwrap'将程序集名称作为第一个参数,而不是程序集的路径。此外,路径'.. \ MyTypes'位于应用程序基目录之外,因此在探测程序集时不会使用它。 – 2013-04-08 15:54:46

+0

你将不得不用你从Fuslogvw.exe得到的跟踪来记录你的问题。 – 2013-04-08 17:34:17

回答

10

AppDomain.CreateInstanceAndUnwrap将加载组件在加载上下文而AppDomain.CreateInstanceFromAndUnwrap将在LoadFrom上下文加载组件。

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

你们中有些人有三种选择:

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

我建议2选项,它将允许您想要的文件夹结构加上通常是优先选择的加载上下文。

+0

我尝试了#2的CreateInstanceAndUnwrap,并且它仍然在执行程序集的基本目录中查看日志中给出的内容。但是,当我尝试CreateInstanceFromAndUnwrap它工作得很好。仍然有一个由assemblyName参数创建的混淆,它实际上是指文件名,它的路径不是程序集名称。 – iamadnan 2013-04-09 12:41:30