.net – 引用具有相同名称空间和类型的两个DLL

我有两个版本的相同的DLL,即LibV1.dll和LibV2.dll.两个库都具有相同的命名空间和类型,但不兼容.我需要能够在VB.Net项目中同时引用它们,以便将数据从旧版本升级到新版本.这在C#中似乎很容易解决,但我读过的所有内容都表明在VB.Net中没有解决方案.事实上,我从2011年看到这个
post,这证实了这一点.我想知道过去4年是否有任何改变现在可能使这成为可能? 最佳答案 对不起,我原本希望粘贴这个评论,但是SO阻止我这样做.

据我所知,VB没有添加C#别名功能,但你断言VB.Net中没有解决方案是不正确的.

您2011年的参考帖子指出您使用Reflection作为变通方法.我认为最简单的方法是选择你想要哪个DLL支持Intellisense并添加对该DLL的引用.然后,您可以使用Reflection.Assembly.LoadFile获取对第二个DLL的引用,并使用该实例上的CreateInstance方法创建对所需类的Object引用.您可以使用后期绑定来处理该类实例.或者,您可以使用Reflection来获取所需的MethodInfo的/ PropertyInfo的/ etc.并通过它们来处理类实例,但我认为这比使用后期绑定要多得多.

编辑添加示例.

Sub Test()
    ' assume you chose Version 2 as to reference in your project
    ' you can create an instance of its classes directly in your code 
    ' with full Intellisense support

    Dim myClass1V2 As New CommonRootNS.Class1

    ' call function Foo on this instance
    Dim resV2 As Int32 = myClass1V2.foo

    ' to get access to Version 1, we will use Reflection to load the Dll

    ' Assume that the Version 1 Dll is stored in the same directory as the exceuting assembly
    Dim path As String = IO.Path.GetDirectoryName(Reflection.Assembly.GetExecutingAssembly.Location)

    Dim dllVersion1Assembly As Reflection.Assembly
    dllVersion1Assembly = Reflection.Assembly.LoadFile(IO.Path.Combine(path, "Test DLL Version 1.dll"))

    ' now create an instance of the Class1 from the Version 1 Dll and store it as an Object
    Dim myClass1V1 As Object = dllVersion1Assembly.CreateInstance("CommonRootNS.Class1")

    ' use late binding to call the 'foo' function. Requires Option Strict Off
    Dim retV1 As Int32 = myClass1V1.foo
End Sub
点赞