Exception powershell 2新对象“;找不到类型…“;从外部库实例化.net类实现的接口时发生异常

Exception powershell 2新对象“;找不到类型…“;从外部库实例化.net类实现的接口时发生异常,exception,.net-3.5,powershell,powershell-2.0,Exception,.net 3.5,Powershell,Powershell 2.0,我发现了一个很容易复制的问题。请告知是否有任何解决方法 有两个.Net库libraryA.dll和libraryB.dll。每个库都有一个接口A和接口B。ClassAA实现了InterfaceA并住在图书馆。ClassAB实现了InterfaceB并生活在同一个图书馆中。同样的方式ClassBB-图书馆B-接口B;ClassBA-图书馆B-接口A 当实例化ClassAA和ClassBB而不是ClassAB或ClassBA时,新对象可以正常工作。它们经常无法实例化 这是powershell代码 [

我发现了一个很容易复制的问题。请告知是否有任何解决方法

有两个.Net库libraryA.dll和libraryB.dll。每个库都有一个接口A和接口B。ClassAA实现了InterfaceA并住在图书馆。ClassAB实现了InterfaceB并生活在同一个图书馆中。同样的方式ClassBB-图书馆B-接口B;ClassBA-图书馆B-接口A

当实例化ClassAA和ClassBB而不是ClassAB或ClassBA时,新对象可以正常工作。它们经常无法实例化

这是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)
非常感谢,


Andrey

这个问题的答案解决了您的问题:

关键是使用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。您可能希望首先修复此问题-假设您在实际项目中有相同的问题…

而不是
::LoadFile
,请使用:

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

当您使用程序集时,该程序集将被加载到具有加载源目录的上下文中,同一目录中引用的程序集将自动解析。用于加载共享标识但位于不同目录中且不保留任何加载上下文的程序集,因此不会解析引用的程序集。

以这种方式执行此操作时,仍会出现错误:New Object:找不到类型[[MyNamespace]::Class1]:验证是否加载了包含此类型的程序集。