2010-11-17 48 views
3

我發現一個很容易重現的問題。請告知是否有任何解決此問題的方法?powershell 2新對象「找不到類型...」異常時實例化.net類實現的接口從外部庫

有兩個.Net庫libraryA.dll和libraryB.dll。每個庫都有一個接口InterfaceA和InterfaceB。 ClassAA實現了InterfaceA並駐留在libraryA中。 ClassAB實現了InterfaceB並位於同一個庫A中。同樣的方法ClassBB - LibraryB - InterfaceB; ClassBA - LibraryB - InterfaceA

當ClassAA和ClassBB實例化但不ClassAB或ClassBA時,New-Object可正常工作。他們經常無法實例化。

在這裏,你是PowerShell代碼

[System.Reflection.Assembly]::LoadFile(‘c:\LibraryA.dll’) 
[System.Reflection.Assembly]::LoadFile(‘c:\LibraryB.dll’) 

$obj1 = new-object -typeName ClassAA (IT WORKS) 
$obj2 = new-object -typeName ClassBB (IT WORKS) 
$obj3 = new-object -typeName ClassAB (EXCEPTION THROWN) 
$obj4 = new-object -typeName ClassBA (EXCEPTION THROWN) 

非常感謝,

安德烈

回答

5

相反的::LoadFile,使用:

[System.Reflection.Assembly]::LoadFrom(‘c:\LibraryA.dll’) 
[System.Reflection.Assembly]::LoadFrom(‘c:\LibraryB.dll’) 

當您使用::LoadFrom大會將被加載到上下文與它從中加載的目錄中,同一目錄中的引用程序集將自動解析。 ::LoadFile用於加載共享身份但位於不同目錄且不保留任何加載上下文的程序集,因此不會解析引用的程序集。

+0

當我這樣做時,我仍然得到錯誤:New-Object:Can not find type [[MyNamespace] :: Class1]:驗證包含此類型的程序集是否已加載。 – James 2014-12-18 12:47:36

3

回答這個問題解決您的問題: How can I get PowerShell Added-Types to use Added Types

的關鍵是使用的AppDomain .CurrentDomain.AssemblyResolve事件。

可以,例如,AssemblyResolver類(從上面的文章)添加到您的LibraryA的,然後用[Utils.AssemblyResolver] :: AddAssemblyLocation(「LibraryB.dll」),在需要的時候LibraryB參考拉。

或者,只是爲了證明這一點:

[System.AppDomain]::CurrentDomain.add_assemblyResolve({ 
    If ($args[1].Name.StartsWith("LibraryB")) 
    { 
     Return [System.Reflection.Assembly]::LoadFile("C:\LibraryB.dll") 
    } 
    Else 
    { 
     Return $Null 
    } 
}) 

注意,你在你上面的例子循環依賴:LibraryA的所引用LibraryB和LibraryB引用LibraryA的。你可能會想先解決這個問題 - 假設你有你的實際項目一樣...