Внедрение внешнего исполняемого файла внутри программы С#
Как встроить внешний исполняемый файл в мое приложение С# Windows Forms?
Изменить: мне нужно встроить его, потому что это внешнее бесплатное консольное приложение (сделанное на С++), из которого я читаю выходные значения для использования в моей программе. Было бы неплохо и профессиональнее, чтобы он был встроен.
Вторая причина - это требование встроить файл проектора Flash в приложение .NET.
Ответы
Ответ 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
Простейший путь, ведущий от того, что будет сказано:
Ответ 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;
}