MSBuildにプラットフォームに依存しないCOMReferenceを生成させるにはどうすればよいですか?

私は最近、すべてのテストプロジェクトをdotnet 4からdotnet 3.5に変更しました(CLR 2.0でコードをテストしたいので、 {F935DC20-1CF0-11D0-ADB9-00C04FD58A0B} 1 0 0 tlbimp False True

テストプロジェクトは「AnyCPU」として構築します。テストプロジェクトが.Net 4の場合、この はANYCPU interop dllを生成するように見えました。今は.NET 3.5で、interop dllはx86で、64ビットプラットフォーム上で実行時に System.BadImageFormatException が発生します。この問題は、テストプロジェクトをダウングレードする前に発生していませんでした。

2
私は、プラットフォームにとらわれないCOMリファレンスのようなものはないと思っています。新しいCLR /ジッタがx86依存性を検出し、特にx86用にコンパイルできるため、動作するはずです。しかし、暗闇の中でちょうど刺す。
追加された 著者 Ben Robinson,

1 答え

Seemed is correct, importing the type library in Visual Studio is always going to set the 32-bit flag in the interop assembly header. You can see this by running corflags.exe on the generated assembly.

VSからプラットフォームに依存しない相互運用ライブラリを作成することはサポートされていません。 Tlbimp.exeを自分で実行する必要があります。 Visual Studioのコマンドプロンプトを使用して、プロジェクトディレクトリに移動します。次に、このコマンドを実行します。

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

生成されたInterop.IWshRuntimeLibrary.dllへの参照をProject +参照の参照、[参照]タブで追加します。ソースコントロールでDLLをチェックインしても問題ありません.COMインターフェイスは石でキャストされています。メインのEXEプロジェクトでPlatformターゲットをx86に設定することも、別の回避策です。

6
追加された
テストランナーは、32ビットモードでコードを実行します。
追加された 著者 Hans Passant,
これはまさに私がやったことです。私はこれがどういう仕組みか分かりませんので、思われたを強調しました。しかし、私は何とかVS2010のdotnet 4テストプロジェクトが何らかの形でこれを動作させることを確認できます
追加された 著者 Rob,
実際には、これはテスト設定で構成可能です。私たちは64ビットプロセスでテストを実行していたので、最初は問題がありました。
追加された 著者 Rob,