C# 第三方DLL在从Excel调用时工作,在从VisualBasic/C调用时崩溃#

C# 第三方DLL在从Excel调用时工作,在从VisualBasic/C调用时崩溃#,c#,vba,com-interop,C#,Vba,Com Interop,我有许多C++Builder第三方x86 DLL,它们用于x86测试DLL。TestDll初始化外部设备并尝试连接它(使用第三方DLL)。TestDll已注册并使com可见,以便在Excel下对其进行测试。它是从Excel的VBA和类似的Visual Basic.Net代码调用的: Dim test As New TestDLL.TestDLL.Class1 Dim i As Integer i = test.Connect() If i = 111 The

我有许多C++Builder第三方x86 DLL,它们用于x86测试DLL。TestDll初始化外部设备并尝试连接它(使用第三方DLL)。TestDll已注册并使com可见,以便在Excel下对其进行测试。它是从Excel的VBA和类似的Visual Basic.Net代码调用的:

    Dim test As New TestDLL.TestDLL.Class1

    Dim i As Integer

    i = test.Connect()

    If i = 111 Then
        lbl1.Text = "Connected"
    End If

    If i = 222 Then
        lbl1.Text = "Not connected"
    End If

    If i = 333 Then
        lbl1.Text = "Error!!!"
    End If
对TestDll的引用添加到Excel中,代码成功返回“Connected”。 当相同的代码从Windows窗体应用程序启动时,它返回“Error!!!”

令我感到困惑的是,在Visual Basic中,thidr party DLL上的引用有一种形式:C:\windows\assembly\GAC_MSIL\Interop.ThirdPartyDL。。。。。。当我在Excel中添加对它的引用时,它的形式是:C:\Program Files(x86)\Common Files\ThirdParty\ThirdParty.dll

我会在Visual Basic中删除(不工作)引用,并通过手动选择该文件将其替换为Excel中的引用

另一种可能性:我知道这可能并不完美,但您可以从其他VBA调用Excel实例,然后在Excel实例中运行代码,从而使用工作文件


Max

在我看来,同一个dll的多个副本位于不同的位置。您可以保留dll的工作副本,并删除其余所有副本。添加dll工作副本的引用。

我尝试过这样做。它会自动将引用添加到GAC。您可以从GAC中删除引用,然后重试。我从GAC中删除了程序集,并仅注册了所需的DLL(使用regsvr32)。Excel在引用中将第三方DLL上的引用显示为ThPart.DLL,而VB中的引用看起来像Interop.ThPart.DLL。第三方DLL的安装已包含互操作,但其长度与bin文件夹中新互操作的长度不同。再说一次:在Excel中,第三方DLL正在工作,而在VB中,则不是。