如何让MSBuild生成与平台无关的COMReference?

时间:2012-02-06 12:02:29

标签: c# com com-interop platform-independent

我最近将所有测试项目从dotnet 4切换到dotnet 3.5(因为我想在CLR 2.0下测试代码(参见here)。大多数工作正常,但是一个测试项目依赖于IWshRuntimeLibrary。这由以下csproj片段指定:

<COMReference Include="IWshRuntimeLibrary">
  <Guid>{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B}</Guid>
  <VersionMajor>1</VersionMajor>
  <VersionMinor>0</VersionMinor>
  <Lcid>0</Lcid>
  <WrapperTool>tlbimp</WrapperTool>
  <Isolated>False</Isolated>
  <EmbedInteropTypes>True</EmbedInteropTypes>
</COMReference>

我们将测试项目构建为“AnyCPU”。当测试项目是.Net 4时,这个似乎来生成一个ANYCPU互操作dll。现在它是.Net 3.5,interop dll是x86,它在64位平台上运行时导致System.BadImageFormatException。在降级测试项目之前没有发生此问题。

2 个答案:

答案 0 :(得分:6)

Seemed 是正确的,在Visual Studio中导入类型库总是要在interop程序集头中设置32位标志。您可以通过在生成的程序集上运行corflags.exe来查看此内容。

不支持从VS创建与平台无关的互操作库。你必须自己运行Tlbimp.exe。使用Visual Studio命令提示符并导航到项目目录。然后运行以下命令:

  

Tlbimp / machine:Agnostic c:\ windows \ system32 \ wshom.ocx

使用Project + Add Reference,Browse选项卡添加对生成的Interop.IWshRuntimeLibrary.dll的引用。可以在源代码管理中签入DLL,COM接口是一成不变的。将主EXE项目上的平台目标设置为x86将是另一种解决方法。

答案 1 :(得分:0)

通过在我的csproj文件中将ProcessorArchitecture属性显式设置为Agnostic,我能够使MSBuild生成与平台无关的COMReference:

<PropertyGroup>
  <ProcessorArchitecture>Agnostic</ProcessorArchitecture>
</PropertyGroup>

我通过查看Microsoft.Common.CurrentVersion.targets中的ResolveComReference MSBuild task来解决这个问题,该值将此值传递给tlbimp.exe /machine flag

话虽这么说,但我选择使用Hans Passant的解决方案,即手动生成DLL并将其添加到源代码管理中,因为它对服务器友好。