1

コマンドを使用しeditbin /LARGEADDRESSAWAREて .NET C# exe を変更し、2 GB を超えるメモリをアドレス指定できるようにしました。これは正常に機能し、dumpbinコマンドを実行して、正常に変更されたことを確認できます。

次に、この exe を含む .msi パッケージの作成に進みます。この .msi を Windows 7 ターゲット マシンで実行すると、exe が正常にインストールされます。しかしdumpbin、ターゲット マシンにインストールされた同じ exe で実行すると、2 GB を超えるメモリをサポートしていないことがわかります。

これは何が原因ですか?ターゲット マシンで .msi をビルドするプロセスですか、それとも .msi を実行するプロセスですか?

4

3 に答える 3

1

msbuild ポスト ビルド ステップで LARGEADDRESSAWARE フラグを設定するための editbin には、いくつかの問題があります。

  1. mspdb100.dll が見つからないため、EditBin x32 は VS コマンド プロンプト以外では実行されません。なぜあなたは気にする必要がありますか?TFS ビルド ワークフローを実行する場合、msbuild は VS コマンド プロンプトから呼び出されません。これにより問題が発生します...
  2. bin\amd64\editbin.exeにあるものを使用してこれを修正できますが、x64 ビルド マシンでのみ exe をビルドできます。
  3. $(TargetPath) で最終ファイルにパッチを適用すると機能しますが、プロジェクトを再構築し、タスクの入力と出力を設定すると、再度実行されません。これは、再構築中に、中間フォルダーからの exe が、パッチが適用されていない最終的な場所に再度コピーされるため、問題です。
  4. これはまだそうではありません。exeに厳密な名前を付けた場合は、厳密な名前を再度有効にするために再署名する必要があるためです。ほとんどの場合、開発マシンでは厳密な名前の検証が無効になっているため、開発マシンでは実行されますが、顧客のマシンでは実行できません。

最後に、タスクは次のようになります。

<Target Name="AfterBuild" BeforeTargets="CopyFilesToOutputDirectory" Inputs="$(IntermediateOutputPath)$(TargetFileName)" Outputs="$(IntermediateOutputPath)largaddessaware.tmp">
   <Exec Command="xxxxxbin\amd64\EditBin.exe /LARGEADDRESSAWARE &quot;$(IntermediateOutputPath)$(TargetFileName)&quot;"/>
   <Exec Command="sn -Ra &quot;$(IntermediateOutputPath)$(TargetFileName)&quot; &quot;$(AssemblyOriginatorKeyFile)&quot;"/>
   <Touch AlwaysCreate="true" Files="$(IntermediateOutputPath)largaddessaware.tmp"/>
</Target>

CopyFiletoOutputDirectory を実行する前に実行可能ファイルにパッチを適用する必要があります。そうしないと、パッチが適用されていないファイルが既に ouptut フォルダーにコピーされた後で、中間ファイルにパッチが適用されます。最終的なファイルにパッチを適用することはできません。これは、インクリメンタル ビルドが壊れないように exe が変更されていない場合、このターゲットが実行されないためです。

これは、単純なタスク (PE ヘッダーに 1 ビットを設定する) の典型的な例であり、正しく行うのは非常に困難です。最初のように見えるほど簡単なことは (ほとんど) ありません。

于 2013-08-30T21:24:10.527 に答える