在C#程序中embedded外部可执行文件

如何在C#Windows窗体应用程序中embedded外部可执行文件?

编辑:我需要embedded它,因为它是一个外部的免费控制台应用程序(使用C ++),从中读取我的程序中使用的输出值。 embedded它会更好,更专业。

第二个原因是需要在.NET应用程序中embeddedFlash投影机文件。

这里有一些示例代码可以粗略地实现这一点,减去任何types的错误检查。 另外,请确保embedded程序的许可证允许这种使用。

 // 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的第一个参数的正确值。 它的forms应该是“namespace.name”,其中namespace是项目的默认名称空间(在Project | Properties | Application | Default namespace下find)。 第二部分是您需要在项目中包含的文件的名称(确保将构build选项设置为“Embedded Resource”)。 如果你把文件放在一个目录下,例如Resources,那么这个名字就成为资源名称的一部分(例如“myProj.Resources.Embedded.exe”)。 如果遇到问题,请尝试在Reflector中打开已编译的二进制文件,然后查看Resources文件夹。 这里列出的名称是您将传递给GetManifestResourceStream的名称。

最简单的方法,从威尔说 :

  1. 使用Resources.resx添加.exe
  2. 代码如下:

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

只需将其添加到您的项目,并将生成选项设置为“embedded式资源”

这可能是最简单的:

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

可执行文件是托pipe程序集吗? 如果是这样,您可以使用ILMerge将该程序集与您的程序集合。

这里是我的版本:将文件作为现有项目添加到项目中,将文件上的属性更改为“embedded式资源”

要dynamic地将文件提取到给定的位置:(这个例子不testing写权限的位置等)

  /// <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. 添加文件到VS工程
  2. 标记为“embedded的资源” – >文件属性
  3. 使用名称parsing:[Assembly Name]。[embedded资源的名称],如“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(); } } } } 

如果需要,将string提取出来:

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