1

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

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

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

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

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

4

1 回答 1

1

正如汉斯所说,我需要使用 64 位版本的 Regasm.exe。即使我已经尝试在安装后手动启动 RegAsm,它也无法正常工作。首先,我在项目的构建后事件中添加了这一点:

"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe" "$(TargetPath)"

这对调试版本起到了作用。奇怪的是,AnyCPU 版本起初在我的 x64 应用程序上运行良好,在调试模式下,当我创建我的安装项目时它开始崩溃(不知道为什么......)。但是这个更改并没有解决我在安装应用程序时的问题,所以我在我的自定义操作的“提交”中添加了这个(基于这篇文章:Regasm- 64bit or 32bit through windows installer in visual studio):

   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 版本并运行它。

于 2014-11-19T15:19:01.637 回答