Встраивание внешнего исполняемого файла в программу на C # - PullRequest
34 голосов
/ 28 апреля 2009

Как встроить внешний исполняемый файл в приложение C # Windows Forms?

Редактировать: мне нужно встроить его, потому что это внешнее бесплатное консольное приложение (сделанное на C ++), из которого я читаю выходные значения для использования в моей программе. Было бы неплохо и более профессионально встроить его.

Вторая причина - это требование встроить файл Flash-проектора в приложение .NET.

Ответы [ 8 ]

57 голосов
/ 15 марта 2012

Простейший путь, ведущий от того, что Уилл сказал :

  1. Добавьте .exe, используя Resources.resx
  2. Код:

    string path = Path.Combine(Path.GetTempPath(), "tempfile.exe");  
    File.WriteAllBytes(path, MyNamespace.Properties.Resources.MyExecutable);
    Process.Start(path);
    
20 голосов
/ 28 апреля 2009

Вот пример кода, который примерно достигнет этого, за исключением проверки ошибок любого рода. Кроме того, убедитесь, что лицензия на встраиваемую программу допускает такой вид использования.

// 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. Он должен иметь форму «namespace.name», где namespace является пространством имен по умолчанию для вашего проекта (найдите его в Project | Properties | Application | Default namespace). Вторая часть - это имя файла, который вам нужно будет включить в ваш проект (не забудьте установить опцию сборки на «Embedded Resource»). Если вы поместите файл в каталог, например, Ресурсы, затем это имя становится частью имени ресурса (например, «myProj.Resources.Embedded.exe»). Если у вас возникли проблемы, попробуйте открыть скомпилированный двоичный файл в Reflector и загляните в папку «Ресурсы». Имена, перечисленные здесь, являются именами, которые вы передадите GetManifestResourceStream.

14 голосов
/ 28 апреля 2009

Просто добавьте его в свой проект и установите опцию сборки "Embedded Resource"

7 голосов
/ 04 марта 2012

Это, наверное, самое простое:

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);
4 голосов
/ 28 апреля 2009

Является ли исполняемый файл управляемой сборкой? В этом случае вы можете использовать ILMerge для объединения этой сборки с вашей.

1 голос
/ 23 февраля 2015
  1. Добавить файл в VS Project
  2. Пометить как «Встроенный ресурс» -> Свойства файла
  3. Используйте имя для разрешения: [Имя сборки]. [Имя встроенного ресурса], например, "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();
                }
            }
        }
    }
1 голос
/ 26 августа 2013

Вот моя версия: Добавьте файл в проект как существующий элемент, измените свойства файла на «Встроенный ресурс»

Для динамического извлечения файла в указанное место: (этот пример не проверяет местоположение для прав на запись и т. Д.)

    /// <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();
            }
    }
0 голосов
/ 23 февраля 2015

Извлечение чего-либо как строки, если необходимо:

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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...