将不同类型的多个文件嵌入到单个C#控制台应用程序中

将不同类型的多个文件嵌入到单个C#控制台应用程序中,c#,C#,编辑以更清楚地了解我正在尝试做什么 我有一个正在开发的控制台应用程序,我希望执行以下操作: string pathToSomeMsi = Path.GetTempFileName(); using (var resStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("theMsi.msi")) using (var fileStream = File.OpenWrite(pathToSomeMsi)) {

编辑以更清楚地了解我正在尝试做什么

我有一个正在开发的控制台应用程序,我希望执行以下操作:

string pathToSomeMsi = Path.GetTempFileName();

using (var resStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("theMsi.msi"))
using (var fileStream = File.OpenWrite(pathToSomeMsi))
{
    resStream.CopyTo(fileStream);
}

installMsi(pathToSomeMsi);
1) 运行msi安装程序以安装特定应用程序

2) 将已写入的控制台应用程序复制到Windows机箱上的公用文件夹

3) 计划运行按计划复制的控制台应用程序的Windows任务

我正在使用Microsoft.Win32.TaskScheduler.dll库(第三方)创建设置任务的代码。当我将exe移动到外部机器时,它没有检测到使任务计划程序代码工作的dll,似乎也没有访问msi或其他控制台应用程序的权限

因此,我需要一种方法将两个控制台应用程序、msi和dll组合成一个exe文件,该文件将按预期在任何机器上运行


我有两个控制台应用程序提供的所有代码,如果需要,可以发布这些代码。

听起来好像您正在尝试编写一个自解压安装程序,它通常分两个阶段工作:

  • 将嵌入的资源解压缩到临时文件夹
  • 使用临时文件夹中的文件开始执行
  • 您可以在C#中执行此操作,方法是将文件作为“嵌入式资源”包含,并使用以下方法将其保存到磁盘:

    string pathToSomeMsi = Path.GetTempFileName();
    
    using (var resStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("theMsi.msi"))
    using (var fileStream = File.OpenWrite(pathToSomeMsi))
    {
        resStream.CopyTo(fileStream);
    }
    
    installMsi(pathToSomeMsi);
    
    也就是说,我建议您不要尝试编写自己的安装程序(或引导程序),因为在处理卸载和修复时,它会相对快速地变得复杂。只需使用为此目的而构建的工具。MSI包括添加计划任务的方法(想到自定义操作[vbs或.net]),大多数好的安装程序包包括引导程序


    看看Wix、dotNetInstaller、NSIS或类似产品。

    您发布了很多代码,但不清楚问题出在哪里。你尝试过的东西会怎么样?你所说的“我似乎不能把它[…]放到这个单一的程序中,使它成为可再发行的”是什么意思?您正在尝试创建一个安装程序exe,还是仅创建一个将各种文件嵌入为资源的控制台应用程序?尝试创建一个包含控制台应用程序、处理任务管理内容的dll和msi的exe。但该exe应该是什么?应用程序的安装程序?微星的目的是什么?在控制台应用程序中嵌入资源很简单,但我不确定这是否是您真正想要的。对,对不起。初始控制台应用程序安装MSI,然后将第二个控制台应用程序(用于检查bitlocker状态)复制到公用文件夹,然后设置windows任务计划以间歇运行该文件。好的,那么到底是什么问题?我还不清楚。您似乎了解如何在控制台应用程序中嵌入资源,尽管您的
    executeembed
    代码包含大量重复内容。现在还不清楚为什么除了
    executeembed
    代码之外的任何东西都与此相关。我们真的需要知道bitlocker在做什么吗?“我似乎无法让[…]成为可再发行的”并没有真正描述正在发生的事情,这也于事无补。