Подтвердить что ты не робот

Внедрение внешнего исполняемого файла внутри программы С#

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

  • Добавьте .exe, используя Resource.resx
  • Введите код:

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

Ответ 3

Просто добавьте его в свой проект и установите для опции сборки значение "Встроенный ресурс"

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

Чтобы динамически извлечь файл в определенную папку: (этот пример не проверяет местоположение для разрешений на запись и т.д.)

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

Ответ 7

  • Добавить файл в проект VS
  • Отметьте как "Встроенный ресурс" → Свойства файла
  • Использовать имя для разрешения: [Имя сборки]. [Имя встроенного ресурса], например "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();
                }
            }
        }
    }

Ответ 8

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

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