好吧,我的头衔可能不够清楚。我使用的是一个我们可以开发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文件将宏链接到我的类。
我试着用RegAsm注册我的DLL,但它在x64中仍然不起作用。有没有办法同时生成x86和x64版本的TLB?然后,我将添加两个引用,如果x64版本在Start方法上抛出一个错误,我只需调用x86方法(不是一个完美的解决方案,但仍然是.)。
知道怎么解决这个问题吗?
发布于 2014-11-19 15:19:01
正如汉斯所说,我需要使用64位版本的Regasm.exe。尽管我已经尝试过在安装后手动启动RegAsm,但它没有工作。首先,我补充说,在我的项目的构建后事件中:
"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe" "$(TargetPath)"这对Debug版本起了作用。奇怪的是,AnyCPU版本最初在我的x64应用程序上运行良好,在调试模式下,当我创建安装项目时,它开始崩溃(不知道为什么.)。但是在安装应用程序时,这个更改并没有解决我的问题,所以我在我的自定义操作的“提交”中添加了这一点(基于本文:在visual studio中通过windows安装程序实现的Regasm- 64位或32位):
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,运行时环境的目录指向了“Microsoft.NET\Framework.”路径不是"Framework64“,它违背了我的操作目的(它已经注册为32位COM互操作),所以我尝试获得x64版本的RegAsm并运行它。
https://stackoverflow.com/questions/26903937
复制相似问题