4

我最近将我们所有的测试项目从 dotnet 4 切换到了 dotnet 3.5(因为我想在 CLR 2.0 下测试代码(请参阅此处)。大多数事情都可以正常工作,但是一个测试项目依赖于 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,互操作 dll 是 x86,这会导致System.BadImageFormatException在 64 位平台上运行时出现错误。在降级测试项目之前不会出现此问题。

4

2 回答 2

9

似乎是正确的,在 Visual Studio 中导入类型库总是会在互操作程序集标头中设置 32 位标志。您可以通过在生成的程序集上运行 corflags.exe 来查看这一点。

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

Tlbimp /machine:不可知 c:\windows\system32\wshom.ocx

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

于 2012-02-06T14:46:31.353 回答
0

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

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

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

话虽如此,我选择使用 Hans Passant 的解决方案,即手动生成 DLL 并将其添加到源代码管理,因为它是构建服务器友好的。

于 2020-06-24T06:54:17.603 回答