【问题标题】:Embed all files into a single exe将所有文件嵌入单个 exe
【发布时间】:2017-12-17 14:33:39
【问题描述】:

我想将所有文件/资源​​嵌入到单个 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;
    }
}

感谢您的帮助!

谢谢

【问题讨论】:

    标签: c# visual-studio powershell merge exe


    【解决方案1】:

    我的问题是关于在没有附加文件的情​​况下将 exe 的 + powershell 编译成单个 exe

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

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

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

    因为 EXE 有一个入口点,您无法处理 2 个 EXE,要解决此问题,只需将其中一个 EXE 更改为 DLL(类库)。

    【讨论】:

    • 对不起,我不太明白你的建议,将exe更改为dll有什么用?
    • 阅读我发布的链接中的详细信息部分输入程序集列表中的第一个程序集是主程序集。当主程序集是可执行文件时,目标程序集将创建为与主程序集具有相同入口点的可执行文件。 - 换句话说,您不能拥有 > 1 个 exe,因为只有一个 Main()
    【解决方案2】:

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

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

    如果您的 exe 在命令提示符下使用它们的依赖项,您在 C# 中应该没有问题

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

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

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

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

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

    【讨论】:

    • 是的,我正在使用 System.Diagnostics.Process 和 System.Management.Automation,我的问题是关于将 exe 的 + powershell 编译成一个没有附加文件的 exe。
    • 还有其他问题吗?我回答了如何完成它,并发布了如何使用代码完成任务的链接。将不同的 exe 编译成一个 exe 与从单个 exe 执行它们是不同的。
    • 从单个 exe 执行它们 - 这就是问题/任务
    • 您的代码将从单个 exe 执行它们。您的意思是您希望将所有文件嵌入到单个 exe 中吗?如果是这样,请将其放在您的问题中。否则,请澄清您的问题以解释您的意思。
    • 非常感谢您的澄清,我已经更新了问题。
    猜你喜欢
    • 1970-01-01
    • 2017-09-04
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 2011-01-10
    相关资源
    最近更新 更多