0

いくつかの .exe および .dll ファイルをアプリケーションに埋め込もうとしています (必要なファイルをプロジェクトに含め、それらを右クリックしてビルド アクションを「埋め込みリソース」に変更するだけです)。抽出するコードは次のとおりです。

private void ExtractTo(string path){
   string filename = "MyNamespace.Resources.MyEmbeddedEXEfile.exe";
   Assembly asm = Assembly.GetExecutingAssembly();
   string[] resourceNames = asm.GetManifestResourceNames();
   if(resourceNames.Contains(filename)){
      Stream s = asm.GetManifestResourceStream(filename);
      byte[] buffer = new byte[s.Length];
      File.WriteAllBytes(path + "\\MyEXEfile.exe", buffer);
   }
}

うまく機能しているようで、埋め込まれたファイルは渡されたパスに抽出され、プロジェクトに含めてリソースとして埋め込んだファイルと同じサイズです。解凍した EXE ファイルをクリックすると、「このファイルのバージョンは、実行中の Windows のバージョンと互換性がありません。コンピュータのシステム情報を確認して、必要かどうかを確認してください」というエラー ダイアログが表示されました。プログラムの x​​86 (32 ビット) または x64 (64 ビット) を選択してから、ソフトウェアの発行元に問い合わせてください。

Windows 7 Ultimate 64 ビットを使用しています。元のファイル (埋め込み用に選んだもの) は 32 ビット ファイルです。私もdllファイルを試してみましたが、抽出されたdllファイルも元のファイルとして機能しませんでした。

リソースを抽出するためのコードのどこが間違っているか、またはリソースとして埋め込んだ直後にファイルが破損していることを指摘していただけますか?

どうぞよろしくお願いいたします。ありがとう。

4

1 に答える 1

6

これ:

Stream s = asm.GetManifestResourceStream(filename);
byte[] buffer = new byte[s.Length];

...実際にはストリームをバッファにコピーしません。ここで行ったのは、正しい長さの空のバッファーを割り当てたことだけです。

次のようなことをする必要があります:

s.CopyTo(File.Create(path));

.... CopyToNET 4.0 で追加された場所。

于 2013-04-06T17:56:01.107 に答える