0

よく説明されていない同様の問題がたくさんあるようです。

環境:

勝利7

VS2012 プロ

Windows SDK 7.0

私たちの環境では、x86 と x64 の 2 つのコード ベースを生成します。この特定のプロジェクトでは、 を生成し*.XMlSerializers.dllます。Generate Serialization Assembliesのビルドでの設定は ですAuto

プロジェクトを x64 構成にコンパイルすると、SGEN エラー「アセンブリを正しくない形式でロードしようとしています... system.data.dll」が表示されます。詳細な調査により次の結果が得られたため、このエラーは完全に誤解を招く可能性があります。

procmonfromを使用しsysinternalsて SGEN をトレースしました

  1. AnyCpuおよびx86 用にビルドすると、 procmonがトレースを表示します。使用中のsgenC:\Program Files\Microsoft SDKs\Windows\v7.0\Bin(32 ビット sngen.exe)からのものです。
  2. x64用にビルドする場合、トレースはなく、上記のエラーのみが表示されます

プロジェクト構成を設定してシリアライザーを作成、x64 でアセンブリをコンパイルしました。次に、コマンドラインを試しました

  1. -で SGEN を使用して成功しましたC:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\x64(注意してください - これは 64 ビットの sgen.exe です)。
  2. x64 アセンブリでの 32 ビット SGEN の実行に失敗しました。

これらの結果から結論が導き出されます。VS2012 がGenerate Serialization AssembliesをONに設定してプロジェクトをコンパイルすると( autoは特殊なケースです)、sgen.exeを見つけようとします。ただし、プロジェクト構成が x64 プラットフォーム用にビルドするように設定されている場合、x64 用にビルドされた適切なsgen.exeが見つかりません。

質問: Visual Studio が適切な SGEN を見つけられるように設定できるmsbuild構成またはレジストリ設定、またはその他の設定はありますか?

回避策、つまりビルド後のイベントとそれをオフにすることについては知っていますが、これは重要ではありません。

4

2 に答える 2

0

一般的に言えば、この XML をプロジェクト ファイルの特定の構成に追加することができ、これは必要な特定のsgen.exeものを指します。

<SGenToolPath>C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\x64</SGenToolPath>

しかし、より広範な環境固有の方法で問題を解決するには、Generate Serialization AssemblyOFFに設定し、ビルド後に別のコマンド ライン アクションを使用する必要がありました。

"path to your specific\sgen.exe" "path\yourFile.dll" /f

ここの多くの開発者は異なるバージョンの VS studio などを使用しているため、この方法で行う必要がありました。sgen.exeそのため、特定のアクションがビルド サーバーのどこにあるかを正確に知っているため、このステップを個別に実行するために特定のアクションをビルド プロセスに追加しました。

于 2016-06-27T15:36:18.317 に答える