将所有文件嵌入到单个exe

时间:2017-07-13 01:22:14

标签: c# visual-studio powershell merge exe

我想将所有文件/资源​​嵌入到单个exe中(2个exe和ps1)

有可能吗?如何做到这一点,目前我已经设法发布项目,但在输出中还有其他文件(应用程序文件,应用程序清单和设置exe) - 我想嵌入到单个exe中。

做了一些阅读,似乎我可能需要嵌入资源并可能创建指针?或者在项目中嵌入图像资源,不确定我是否在正确的轨道和/或如何启动代码..

到目前为止我有什么

private Boolean Install_certificate()
{
    try
    {
        var newProcessInfo = new System.Diagnostics.ProcessStartInfo()
        {
            FileName = @"C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe",
            Verb = "runas",
            Arguments = (@"–ExecutionPolicy Bypass ""script.ps1""")

        };
        System.Diagnostics.Process.Start(newProcessInfo);


        // Install the cert & change proxy settings
        //System.Diagnostics.Process.Start(@"script.ps1" );
        return true;
    }
    catch
    {
        return false;
    }
}
private Boolean Install_exe1()
{
    try
    {
        // Install exe1
        System.Diagnostics.Process.Start(@"setup1.exe");

        return true;

    }
    catch
    {
        return false;
    }
}
private Boolean Install_exe2()
{
    try
    {
        // Install exe2
        System.Diagnostics.Process.Start(@"setup2.exe");
        return true;
    }
    catch
    {
        return false;
    }
}

感谢帮助!

由于

2 个答案:

答案 0 :(得分:1)

您可以使用System.Diagnostics.Process启动.exe文件。

您可以使用System.Management.Automation运行power shell脚本。

如果你的exes在命令提示符下使用它们的依赖项,你应该在C#

中遇到问题

如果要将这些文件嵌入到c#项目中,可以add them as resources,当程序运行时,可以将二进制内容保存到exe文件中,然后执行它们:

简而言之,右键单击您的项目,选择属性,然后单击资源。单击链接以将默认资源文件添加到项目中,

然后在资源设计器中选择文件,然后添加资源并添加要嵌入的文件。这将创建一个Resources文件,其中包含您的文件,您可以在应用程序中以byte[]的形式访问这些文件。

enter image description here

然后,当应用程序启动时,将它们保存到磁盘并运行它们:

using System;
using System.IO;
using System.Diagnostics;
namespace myNs
{

    class Program
    {
        static void unpack()
        {
            if (!File.Exists("exe1.exe"))
                File.WriteAllBytes("exe1.exe", myNs.Properties.Resources.exe1);
            if (!File.Exists("exe2.exe"))
                File.WriteAllBytes("exe2.exe", myNs.Properties.Resources.exe2);
            if (!File.Exists("ps1.ps")) if (!File.Exists("ps1.ps"))
                    File.WriteAllBytes("ps1.ps", myNs.Properties.Resources.ps1);
        }
        static void Main(string[] args)
        {
            unpack();
            Process process = new Process();
            process.StartInfo.FileName = "exe1.exe";
            process.Start();
            process.WaitForExit();

            process = new Process();
            process.StartInfo.FileName = "exe2.exe";
            process.Start();
            process.WaitForExit();

            process = new Process();
            process.StartInfo.FileName = @"C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe";
            process.StartInfo.Arguments = "ps1.ps1";
            process.Start();
            process.WaitForExit();
        }
    }
}

答案 1 :(得分:0)

  

我的问题是关于将exe' s + powershell编译成单个exe而没有附加文件

您可以将ps1脚本添加为像Alexander Higgins所说的资源。

您可以使用Microsoft的工具ILMerge将两个程序集合并在一起。在这里,我们将Primary.dll Secondary.dll(和等)合并到Merged.dll中,并将log.txt合并到合并中。

ilmerge /log:log.txt /out:Merged.dll Primary.dll Secondary.dll 

因为EXE有一个入口点,你不能超过2个EXE,为了解决这个问题,只需将其中一个EXE更改为DLL(类库)。