39

C# Windows フォーム アプリケーション内に外部実行可能ファイルを埋め込むにはどうすればよいですか?

編集: プログラムで使用する出力値を読み取る外部の無料のコンソール アプリケーション (C++ で作成) であるため、埋め込む必要があります。それを埋め込むと、よりプロフェッショナルになります。

2 つ目の理由は、Flash プロジェクタ ファイルを .NET アプリケーション内に埋め込む必要があるためです。

4

8 に答える 8

61

最も簡単な方法は、ウィルが言ったことから導きます:

  1. Resources.resxを使用して.exeを追加します
  2. これをコーディングします:

    string path = Path.Combine(Path.GetTempPath(), "tempfile.exe");  
    File.WriteAllBytes(path, MyNamespace.Properties.Resources.MyExecutable);
    Process.Start(path);
    
于 2012-03-15T12:02:37.430 に答える
25

以下は、エラー チェックを行わずに、これを大まかに実行するサンプル コードです。また、組み込むプログラムのライセンスがこのような使用を許可していることを確認してください。

// extracts [resource] into the the file specified by [path]
void ExtractResource( string resource, string path )
{
    Stream stream = GetType().Assembly.GetManifestResourceStream( resource );
    byte[] bytes = new byte[(int)stream.Length];
    stream.Read( bytes, 0, bytes.Length );
    File.WriteAllBytes( path, bytes );
}

string exePath = "c:\temp\embedded.exe";
ExtractResource( "myProj.embedded.exe", exePath );
// run the exe...
File.Delete( exePath );

唯一のトリッキーな部分は、 への最初の引数の正しい値を取得することExtractResourceです。名前空間はプロジェクトのデフォルトの名前空間です (これは [プロジェクト | プロパティ | アプリケーション | デフォルトの名前空間] にあります)。2 番目の部分は、プロジェクトに含める必要があるファイルの名前です (ビルド オプションを「埋め込みリソース」に設定してください)。Resources などのディレクトリにファイルを配置すると、その名前がリソース名の一部になります (例: "myProj.Resources.Embedded.exe")。問題が発生した場合は、コンパイル済みのバイナリを Reflector で開いて、Resources フォルダーを確認してください。ここにリストされている名前は、 に渡す名前ですGetManifestResourceStream

于 2009-04-28T17:23:42.063 に答える
14

プロジェクトに追加して、ビルド オプションを「埋め込みリソース」に設定するだけです。

于 2009-04-28T16:01:22.573 に答える
8

これはおそらく最も簡単です:

byte[] exeBytes = Properties.Resources.myApp;
string exeToRun = Path.Combine(Path.GetTempPath(), "myApp.exe");

using (FileStream exeFile = new FileStream(exeToRun, FileMode.CreateNew))
    exeFile.Write(exeBytes, 0, exeBytes.Length);

Process.Start(exeToRun);
于 2012-03-04T14:32:17.247 に答える
4

実行可能ファイルはマネージド アセンブリですか? その場合、ILMergeを使用してそのアセンブリを自分のアセンブリとマージできます。

于 2009-04-28T15:57:35.360 に答える
1
  1. VS プロジェクトにファイルを追加
  2. 「埋め込みリソース」としてマーク -> ファイルのプロパティ
  3. 解決する名前を使用: [アセンブリ名].[埋め込みリソースの名前] like "MyFunkyNTServcice.SelfDelete.bat"

あなたのコードにはリソースのバグがあります (ファイル ハンドルが解放されていません!)。次のように修正してください:

public static void extractResource(String embeddedFileName, String destinationPath)
    {
        var currentAssembly = Assembly.GetExecutingAssembly();
        var arrResources = currentAssembly.GetManifestResourceNames();
        foreach (var resourceName in arrResources)
        {
            if (resourceName.ToUpper().EndsWith(embeddedFileName.ToUpper()))
            {
                using (var resourceToSave = currentAssembly.GetManifestResourceStream(resourceName))
                {
                    using (var output = File.OpenWrite(destinationPath))
                        resourceToSave.CopyTo(output);
                    resourceToSave.Close();
                }
            }
        }
    }
于 2015-02-23T13:08:58.023 に答える
0

必要に応じて、何かを文字列として抽出します。

public static string ExtractResourceAsString(String embeddedFileName)
    {
        var currentAssembly = Assembly.GetExecutingAssembly();
        var arrResources = currentAssembly.GetManifestResourceNames();
        foreach (var resourceName in arrResources)
        {
            if (resourceName.ToUpper().EndsWith(embeddedFileName.ToUpper()))
            {
                using (var resourceToSave = currentAssembly.GetManifestResourceStream(resourceName))
                {
                    using (var output = new MemoryStream())
                    {
                        resourceToSave.CopyTo(output);
                        return Encoding.ASCII.GetString(output.ToArray());
                    }
                }
            }
        }

        return string.Empty;
    }
于 2015-02-23T19:40:44.817 に答える