注册32位COM服务器(并生成TLB)以用于32位和64位客户端

时间:2014-04-21 20:11:22

标签: windows com regasm

方法1:x86目标平台

我有一个.NET类库,适用于32位和64位客户端,其中一些是.NET项目,其中一些是C ++ MFC项目。我可以让这个库与32位客户端一起工作,但是64位客户端会得到一个未注册的"类"例外。在注册表中查看,看起来只有win32键被设置(HKEY_CLASSES_ROOT \ Wow6432Node \ TypeLib {GUID} \ 1.0 \ 0 \ win32)。

关于我的一些设置的一些注释:

  • "注册COM互操作"检查。
  • "使装配COM-Visible"检查。
  • "平台目标"是x86。
  • 该库包含一个32位非托管DLL,可以使用DLLImport加载方法。
  • C ++ MFC客户端使用#import "MyLibrary.tlb"来编组互操作代码。
  • 我没有对代码进行任何更改以支持COM。 (例如,我没有覆盖System.Configuration.Install.Installer.Install。)

为了解决这个问题,我在一些研究和调查的基础上尝试了几件事。

方法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。)


我想我应该在这里澄清一下这个架构。这是一个图表,演示了我希望这些组件如何运作。

enter image description here

正如您所看到的,我需要64位代码通过COM服务器与32位代码进行交互,正如@ MC-ND所说,它应该可以工作。我应该如何配置我的COM服务器来支持它?

1 个答案:

答案 0 :(得分:0)

来自MSDN: Process Interoperability

  

在64位Windows上,64位进程无法加载32位动态链接   库(DLL)。此外,32位进程无法加载64位DLL

您最好的选择似乎是将您的组件编译为32位进程外COM服务器。