好吧,我的标题可能不够清楚。我使用了一个我们可以为其开发 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 版本并运行它。