如何安装COM DLL的32位和64位版本并"自动选择"?

Nul*_*tc. 7 com 32bit-64bit

我们有一个DLL(一个COM服务器)可以在32位和64位编译,但DLL使用相同的CLSID和AppID 32位版本和64位版本.这样可以,还是必须改变?

我问这个是因为显然在64位机器上,我们无法将32位版本和64位版本注册在一起.如果32位客户端应用程序可以自动使用32位DLL,并且64位客户端应用程序可以自动使用64位DLL,那将是很好的.

在相关的说明中,我们有客户端应用程序的源代码和Visual Studio 2005项目文件...我们如何编译同一应用程序的32位和64位版本?它是一个C#应用程序,它包含对我们的COM服务器DLL的引用,如下所示:

<ItemGroup> <COMReference Include="ComServer">

<Guid>{C1FADEA6-68FD-4F43-9FC2-0BC451FA5D53}</Guid>

<VersionMajor>830</VersionMajor> <VersionMinor>0</VersionMinor>

<Lcid>0</Lcid> <WrapperTool>tlbimp</WrapperTool> <Isolated>False</Isolated>

</COMReference> </ItemGroup>

如果事实证明我们需要一个单独的64位CLSID,我们如何在Visual Studio中"仅针对32位配置"进行此引用?或者我们必须有相同的源代码的单独项目:一个引用32位DLL,另一个引用64位DLL?

Cia*_*ing 14

两个版本都可以(实际上应该)为所有内容使用相同的GUID.

在32位机器上,您无法注册或使用64位DLL,因此没有问题.64位DLL根本不进入图片.

在64位计算机上,64位DLL在HKLM/Software/Classes/CLSID(等)中注册,32位DLL在HKLM/Software/Wow6432Node/Classes/CLSID中注册.(我想知道你在哪里得到的建议是你不能在64位计算机上注册32位DLL ...)在64位计算机上运行的32位客户端将在注册表中的正常位置查找,但操作系统将默默地将其重定向到Wow6432Node键.

  • 忘了说...在64位机器上,在\ Windows\SysWow64 \中有一个32位版本的regsvr32.dll用于在Wow6432Node区域注册32位DLL.(你只需要习惯完全反直觉的命名模式.)我们的安装程序有问题 - 在64位机器上它不会使用32位regsvr32.dll,但我们需要安装32位DLL.所以我们最终编写了自己的版本并明确地运行它. (2认同)

Han*_*ant 8

这是在Windows内部处理的,具有称为" 注册表重定向 "的功能在64位版本的Windows上,32位程序获得了不同的注册表视图.对于COM服务器使用的密钥类型,将重定向对HKCR别名或HKLM\Software根目录的任何访问权限.32位程序实际上看到存储在HKLM\Software\Wow6432Node中的键值.您可以使用Regedit.exe查看它

这通常由安装程序处理,VS Setup项目具有TargetPlatform属性.如果要在32位和64位模式下使COM服务器可用,则应使用两个安装程序.或者是一个写入两组密钥的64位安装程序.拥有可以处理两者的COM服务器在过去很不寻常.但是,当您在.NET中实现时,并非闻所未闻.