我们有一个使用多个COM引用的Visual Studio 2012项目(C#)。我将它带入Git并且无法弄清楚如何处理COM引用。如果我以典型方式添加COM引用,(添加引用 - > COM选项卡 - >选择我的引用),会出现以下情况:
Visual Studio在* .csproj文件中添加了对引用的提及,其中包括GUID字段和版本字段。从这里,我认为Visual Studio在windows \ system32文件夹中查找并在构建时找到必需的DLL。在一些开发PC上,我们有Windows 8,而在其他PC上我们有Windows 7,事实证明每个版本的Windows都引用了不同版本的COM DLL。所以,如果我:1)在Windows 8 PC上添加引用; 2)将项目提交给Git; 3)在Windows 7 pc上签出项目; 4)尝试在Windows 7 pc上构建项目 - 构建失败。这是因为Windows 7 pc具有与Windows 8 PC上不同版本的COM DLL。
处理这种情况的最佳方法是什么?我应该手动将必要的COM DLL复制到我的项目文件夹中并在Git中对它们进行版本控制吗?如果我这样做,我将如何处理Microsoft对其DLL的更新? (定期检查windows \ system32文件夹中的差异?)还有 - 我将哪个版本复制到项目文件夹中 - Windows 8或Windows 7附带的版本?
答案 0 :(得分:6)
我没有看到任何重大差异,两个类型库都是版本1.0,并且自Vista以来我没有改变。在Win7机器上添加引用会生成完全相同的引用节点:
<COMReference Include="CERTCLIENTLib">
<Guid>{372FCE32-4324-11D0-8810-00A0C903B83C}</Guid>
<VersionMajor>1</VersionMajor>
<VersionMinor>0</VersionMinor>
<Lcid>0</Lcid>
<WrapperTool>tlbimp</WrapperTool>
<Isolated>False</Isolated>
<EmbedInteropTypes>True</EmbedInteropTypes>
</COMReference>
<COMReference Include="CERTENROLLLib">
<Guid>{728AB348-217D-11DA-B2A4-000E7BBB2B09}</Guid>
<VersionMajor>1</VersionMajor>
<VersionMinor>0</VersionMinor>
<Lcid>0</Lcid>
<WrapperTool>tlbimp</WrapperTool>
<Isolated>False</Isolated>
<EmbedInteropTypes>True</EmbedInteropTypes>
</COMReference>
但是,如注释中所述,CERTCLIENTLib类型库名称已更改为CERTCLILib。这些名称更改的确切原因对我来说并不清楚,可能是为了使其更好地匹配描述属性。我已经看到这种情况发生once before。
这不会影响COM代码的工作方式,但它会影响C#代码,因为类型库导入器会选择类型库的名称作为库中声明的命名空间名称。完全无关紧要,Tlbimp.exe实用程序允许使用/ namespace选项更改命名空间名称。
不幸的是,当您直接添加引用并让构建系统生成互操作库时,该选项不可用。你必须自己运行Tlbimp.exe来解决这个问题。从Visual Studio命令提示符执行此操作:
cd \where\your\project\is\stored
tlbimp c:\windows\system32\certcli.dll
将生成的DLL添加到源代码管理并添加对它的引用。请在源代码文件中记下这一点,这可能会在10年后开始。