我最近将所有测试项目从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
。在降级测试项目之前没有发生此问题。
答案 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并将其添加到源代码管理中,因为它对服务器友好。