wake-up-neo.net

Einbetten einer externen ausführbaren Datei in ein C # -Programm

Wie binde ich eine externe ausführbare Datei in meine C # Windows Forms-Anwendung ein?

Edit: Ich muss es einbetten, da es sich um eine externe freie Konsolenanwendung (in C++) handelt, aus der ich die Ausgabewerte gelesen habe, die in meinem Programm verwendet werden sollen. Es wäre schön und professioneller, wenn es eingebettet wäre.

Der zweite Grund ist die Anforderung, eine Flash-Projektordatei in eine .NET-Anwendung einzubetten.

33
Josh

Hier ist ein Beispielcode, der dies in etwa erreichen würde, ohne jegliche Fehlerprüfung. Stellen Sie außerdem sicher, dass die Lizenz des einzubettenden Programms diese Art der Verwendung zulässt.

// 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 );

Der einzige schwierige Teil ist, den richtigen Wert für das erste Argument von ExtractResource zu erhalten. Es sollte die Form "namespace.name" haben, wobei Namespace der Standard-Namespace für Ihr Projekt ist (finden Sie dies unter Projekt | Eigenschaften | Anwendung | Standard-Namespace). Der zweite Teil ist der Name der Datei, die Sie in Ihr Projekt aufnehmen müssen (stellen Sie sicher, dass die Build-Option auf "Embedded Resource" gesetzt ist). Wenn Sie die Datei in einem Verzeichnis ablegen, z. Ressourcen, dann wird dieser Name Teil des Ressourcennamens (z. B. "myProj.Resources.Embedded.exe"). Wenn Sie Probleme haben, versuchen Sie, Ihre kompilierte Binärdatei in Reflector zu öffnen, und suchen Sie im Ordner Ressourcen. Die hier aufgelisteten Namen sind die Namen, die Sie an GetManifestResourceStream übergeben würden.

20
Charlie

Der einfachste Weg, ausgehend von dem, was Will sagte :

  1. Fügen Sie die EXE-Datei mit Resources.resx hinzu
  2. Code dies:

    string path = Path.Combine(Path.GetTempPath(), "tempfile.exe");  
    File.WriteAllBytes(path, MyNamespace.Properties.Resources.MyExecutable);
    Process.Start(path);
    
54
dav_i

Fügen Sie es einfach zu Ihrem Projekt hinzu und setzen Sie die Build-Option auf "Embedded Resource".

14
scottm

Dies ist wahrscheinlich das einfachste:

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);
7
nawfal

Ist die ausführbare Datei eine verwaltete Assembly? In diesem Fall können Sie ILMerge verwenden, um diese Assembly mit Ihrer eigenen zusammenzuführen.

4
Andrew Hare
  1. Datei zu VS Project hinzufügen
  2. Als "eingebettete Ressource" markieren -> Dateieigenschaften
  3. Verwenden Sie den Namen für die Auflösung: [Assemblyname]. [Name der eingebetteten Ressource] wie "MyFunkyNTServcice.SelfDelete.bat"

Ihr Code hat einen Ressourcenfehler (Dateihandle nicht freigegeben!), Bitte korrigieren Sie:

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();
                }
            }
        }
    }
1

Hier ist meine Version: Fügen Sie dem Projekt die Datei als vorhandenes Element hinzu. Ändern Sie die Eigenschaften der Datei in "Eingebettete Ressource".

So extrahieren Sie die Datei dynamisch an einen bestimmten Speicherort: (In diesem Beispiel wird der Speicherort nicht auf Schreibberechtigungen geprüft usw.).

    /// <summary>
    /// Extract Embedded resource files to a given path
    /// </summary>
    /// <param name="embeddedFileName">Name of the embedded resource file</param>
    /// <param name="destinationPath">Path and file to export resource to</param>
    public static void extractResource(String embeddedFileName, String destinationPath)
    {
        Assembly currentAssembly = Assembly.GetExecutingAssembly();
        string[] arrResources = currentAssembly.GetManifestResourceNames();
        foreach (string resourceName in arrResources)
            if (resourceName.ToUpper().EndsWith(embeddedFileName.ToUpper()))
            {
                Stream resourceToSave = currentAssembly.GetManifestResourceStream(resourceName);
                var output = File.OpenWrite(destinationPath);
                resourceToSave.CopyTo(output);
                resourceToSave.Close();
            }
    }
1
Fred B

Extrahieren Sie ggf. etwas als Zeichenfolge:

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;
    }
0