2013-04-08 154 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