方法1:x86目标平台
我有一个.NET类库,适用于32位和64位客户端,其中一些是.NET项目,其中一些是C ++ MFC项目。我可以让这个库与32位客户端一起工作,但是64位客户端会得到一个未注册的"类"例外。在注册表中查看,看起来只有win32键被设置(HKEY_CLASSES_ROOT \ Wow6432Node \ TypeLib {GUID} \ 1.0 \ 0 \ win32)。
关于我的一些设置的一些注释:
#import "MyLibrary.tlb"
来编组互操作代码。为了解决这个问题,我在一些研究和调查的基础上尝试了几件事。
方法2:"任何CPU"目标平台
首先,我尝试将平台目标设置为"任何CPU"。在这种情况下,win32和win64密钥都在注册表中设置,64位客户端可以与COM服务器通信。但是,当我这样做时,我收到错误"试图加载一个格式不正确的程序。"这是由于32位非托管DLL,这要求我使用x86构建项目。
方法3:获取我的库的非托管DLL依赖项的64位版本
要解决此问题,我可能会获得非托管DLL的64位版本。但是,我们已经从第三方购买了这个DLL,无论出于何种原因,它们都会为64位版本的DLL收取大量额外费用。除了显式成本之外,我还需要implement DLLImport calls for each并根据它是32位还是64位调用,这将使我的包装类中的方法数量增加三倍。因此,虽然这是一个可能的解决方案,但它远非理想,而且根据我对COM的理解,这不应该是必要的。
方法4:regsvr32.exe
我在网上找到的最常见解决方案是使用regsvr32.exe手动注册32位和64位互操作的应用程序。但是,我需要TLB文件以与我的MFC客户端进行互操作,并apparently regsvr32 doesn't support this。
方法5:regasm.exe
要获取TLB文件并希望注册32位和64位互操作,我还尝试使用regasm.exe手动注册程序集。我使用以下命令执行此操作。
"%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\regasm.exe" "D:\Path\To\MyLibrary.dll" /tlb /nologo
但是,这仅注册 64位COM服务器,并且缺少win32 COM注册表项。现在,我的32位客户端无法找到COM服务器并说“#34; Class未注册。”#34;此外,对于64位客户端,我得到的错误与我在选择"任何CPU"时所看到的相同:"尝试加载格式不正确的程序。&#34 ;
TL; DR 如何注册32位COM服务器以用于32位和64位客户端应用程序? (注意到我需要TLB文件,并且服务器需要加载非托管的32位DLL。)
我想我应该在这里澄清一下这个架构。这是一个图表,演示了我希望这些组件如何运作。
正如您所看到的,我需要64位代码通过COM服务器与32位代码进行交互,正如@ MC-ND所说,它应该可以工作。我应该如何配置我的COM服务器来支持它?
答案 0 :(得分:0)
来自MSDN: Process Interoperability
在64位Windows上,64位进程无法加载32位动态链接 库(DLL)。此外,32位进程无法加载64位DLL
您最好的选择似乎是将您的组件编译为32位进程外COM服务器。