Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将.exe文件打包为msi文件中的_C#_.net_Windows_Windows Installer_Installation - Fatal编程技术网

C# 将.exe文件打包为msi文件中的

C# 将.exe文件打包为msi文件中的,c#,.net,windows,windows-installer,installation,C#,.net,Windows,Windows Installer,Installation,是否有指向在.msi文件中打包.exe文件的指针 当我单击.msi文件时,它应该执行.exe文件,该文件在.msi文件中打包 我很乐意以程序化的方式来做这件事。或者也欢迎任何以非编程方式执行相同操作的想法:制作一个名为self_extracting.exe的单独程序,将安装文件复制到self_extracting文件的资源部分 运行self_extracting.exe时,它将从自己的资源中提取main.msi并将其复制到硬盘。然后,self_extracting.exe将从硬盘执行main.m

是否有指向在.msi文件中打包.exe文件的指针

当我单击.msi文件时,它应该执行.exe文件,该文件在.msi文件中打包


我很乐意以程序化的方式来做这件事。或者也欢迎任何以非编程方式执行相同操作的想法:

制作一个名为self_extracting.exe的单独程序,将安装文件复制到self_extracting文件的资源部分

运行self_extracting.exe时,它将从自己的资源中提取main.msi并将其复制到硬盘。然后,self_extracting.exe将从硬盘执行main.msi

这是c语言中的一个例子

上面的例子可能过于复杂了。下面是一个使用WinAPI执行此操作的简单示例:

< P>创建C++ Win32 Projt/

将此行添加到*.rc文件:

1 RCDATA "path_on_my_computer.msi"
生成项目时,*.msi文件将写入资源部分。如果*.msi文件发生更改,请重新编译资源文件

您有一个*.cpp文件,如下所示:

#include "stdafx.h"//if using precompiled headers
#include <windows.h>
#include <fstream>

int APIENTRY wWinMain(HINSTANCE, HINSTANCE, wchar_t*, int)
{
    HRSRC hrsrc = FindResource(0, MAKEINTRESOURCE(1), RT_RCDATA);
    if (!hrsrc) return 0;

    HANDLE hglob = LoadResource(0, hrsrc);
    if (!hglob) return 0;

    unsigned int size = SizeofResource(0, hrsrc);
    if (size <= 0) return 0;

    void *ptr = LockResource(hglob);

    wchar_t* setup_file = L"path_on_user_computer.msi";
    std::ofstream f(setup_file, std::ios::binary | std::ios::out);
    f.write((char*)ptr, size);
    f.close();

    ShellExecute(0, 0, setup_file, 0, 0, SW_SHOWNORMAL);

    return 0;
}

在发布模式下,转到项目属性->代码生成->运行时库,然后选择多线程/MT,这样*.exe文件可以在没有依赖项的情况下运行。

制作一个名为self_extracting.exe的单独程序,将安装文件复制到self_extracting文件的资源部分

运行self_extracting.exe时,它将从自己的资源中提取main.msi并将其复制到硬盘。然后,self_extracting.exe将从硬盘执行main.msi

这是c语言中的一个例子

上面的例子可能过于复杂了。下面是一个使用WinAPI执行此操作的简单示例:

< P>创建C++ Win32 Projt/

将此行添加到*.rc文件:

1 RCDATA "path_on_my_computer.msi"
生成项目时,*.msi文件将写入资源部分。如果*.msi文件发生更改,请重新编译资源文件

您有一个*.cpp文件,如下所示:

#include "stdafx.h"//if using precompiled headers
#include <windows.h>
#include <fstream>

int APIENTRY wWinMain(HINSTANCE, HINSTANCE, wchar_t*, int)
{
    HRSRC hrsrc = FindResource(0, MAKEINTRESOURCE(1), RT_RCDATA);
    if (!hrsrc) return 0;

    HANDLE hglob = LoadResource(0, hrsrc);
    if (!hglob) return 0;

    unsigned int size = SizeofResource(0, hrsrc);
    if (size <= 0) return 0;

    void *ptr = LockResource(hglob);

    wchar_t* setup_file = L"path_on_user_computer.msi";
    std::ofstream f(setup_file, std::ios::binary | std::ios::out);
    f.write((char*)ptr, size);
    f.close();

    ShellExecute(0, 0, setup_file, 0, 0, SW_SHOWNORMAL);

    return 0;
}

在发布模式下,转到项目属性->代码生成->运行时库,然后选择多线程/MT,这样*.exe文件就可以在没有依赖项的情况下运行。

使用高级安装程序可以非常轻松地完成这项工作,有一个教程可以在您的exe上创建MSI包装

不需要编码


您可以在此包装器中放置多个EXE安装程序,以链接它们的执行。此外,对于每个EXE,如果EXE支持此类开关,您可以传递命令行开关以使其安装静音,因此您可以获得支持完全自动化的MSI来安装EXE。

使用高级安装程序可以非常轻松地完成此操作,有一个教程可以在您的EXE上实际创建MSI包装

不需要编码


您可以在此包装器中放置多个EXE安装程序,以链接它们的执行。此外,对于每个EXE,如果EXE支持此类开关,您可以传递命令行开关以使其安装静音,因此您可以获得支持完全自动化的MSI来安装EXE。

您可以将.EXE文件打包到另一个.EXE文件中,或将.MSI打包到另一个.EXE文件中。exe@BarmakShemirani你说得对。我正在寻找一个如何做到这一点的医生。你知道我可以参考的一些网站或文档吗?你可以将.exe文件打包到另一个.exe文件中,或者将.msi打包到另一个.exe文件中。exe@BarmakShemirani你说得对。我正在寻找一个如何做到这一点的医生。你知道一些我可以参考的网站或文档吗