AnyCPU COM 库(.tlb 文件)在 x64 中从外部 VB6 宏调用时不起作用



好吧,我的标题可能不够清楚。我使用了一个我们可以为其开发 VB6 宏的应用程序。此宏需要与我也开发的 .NET dll 一起使用。当我以 x86 模式启动应用程序并尝试运行宏时,它工作正常,我可以访问类的方法和所有内容。

但是当我在x64模式下做同样的事情时,我收到错误:"Automation server can't create object"

真正奇怪的是我没有使用任何 x86 非托管 COM dll,这将是 x64 架构的问题。当我这样做时:"Dim myClass as new MyClass.App"它正在工作,但是当我调用例如myClass.Start()方法时,我收到此错误。我尝试在我的Start方法中只MsgBox('hello world'),以确保它与我的代码无关,仍然没有运气。我正在使用TLB文件将我的宏链接到我的类。

我尝试向 RegAsm 注册我的 DLL,但它在 x64 中仍然不起作用。有没有办法同时生成我的TLB的 x86 和 x64 版本?然后我会添加这两个引用,如果 x64 版本在 Start 方法上给我抛出错误,我只需调用 x86 方法(不是一个完美的解决方案,但仍然......

知道如何解决这个问题吗?

正如 Hans 所说,我需要使用 64 位版本的 Regasm.exe。即使我已经尝试在安装后手动启动RegAsm,但它不起作用。首先,我在项目的构建后事件中添加了它:

"C:WindowsMicrosoft.NETFramework64v4.0.30319regasm.exe" "$(TargetPath)"

这为调试版本做了诀窍。奇怪的是,AnyCPU 版本起初在我的 x64 应用程序上运行良好,在调试模式下,当我创建安装项目时它开始崩溃(不知道为什么......但是此更改并不能解决我在安装应用程序时的问题,因此我在自定义操作的"提交"中添加了它(基于本文:Regasm- 64位或32位,通过Visual Studio中的Windows安装程序):

   Public Overrides Sub Commit(savedState As System.Collections.IDictionary)
        MyBase.Commit(savedState)
        'Check if we're on a x64 OS
        If Environment.Is64BitOperatingSystem Then
            'Get the Windows dir on the current computer
            Dim winDir As String = New IO.DirectoryInfo(Environment.SystemDirectory).Parent.FullName
            'Define the path to regasm for x64 machines
            Dim regasmPath As String = IO.Path.Combine(winDir, "Microsoft.NET", "Framework64", System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion, "RegAsm.exe")
            If File.Exists(regasmPath) Then 'Si le chemin existe, on enregistre la DLL
                'Get the location of our DLL
                Dim componentPath As String = GetType(Installer).Assembly.Location
                'Executes regasm
                System.Diagnostics.Process.Start(regasmPath, "/codebase """ & componentPath & """")
            End If
        End If
    End Sub

我从原始文章中更改的是通往RegAsm的路径。由于我的设置是x86,因此RuntimeEnvironnment的目录指向"Microsoft.NET\Framework..."路径不是"Framework64",它违背了我的操作目的(它已经注册为 32 位 COM 互操作),所以我尝试获取 RegAsm 的 x64 版本并运行它。

最新更新