经过大量实验后,我得出的结论是 Windows Installer 是一种糟糕的技术。但客户需要 MSI 文件。

那么,如何创建一个 MSI 文件,将 EXE 文件提取到临时目录并使用与传递给 EXE 文件相同或相似的选项运行它?

MSI 的选项在中进行了解释 Msiexec(命令行选项) (MSI 的低级“运行”是 msiexec 选项 package.msi)。

编辑:mjmarsh 的 WiX 解决方案看起来很有效。我只是还没有机会尝试(关键时刻)。如果有效的话我会接受。

编辑:这是行不通的。缺失的一块:有人值守/无人值守似乎不可用。

不管怎样,唯一让这个工作起作用的是自定义操作杀死它的父进程!

编辑:因此,有人发布了进一步的答案,将整个事情包装为安装后自定义操作。理论上是可能的,但由于可能需要重新启动(感谢 MS 的 .NET 4 有时需要重新启动),我们必须进行进一步的黑客攻击。所以从优势矩阵来看:

Transparency: No. One big custom action.
Customizability: No.
Standardization: No. 
Management and reporting: No. Appears to work but will not.
Security: No benefit.
Validation: No. The hackery required to survive reboot makes this sure to not work.
Resiliency: Completely defeated.
Rollback: No. Rollback didn't work when we were using MSI anyway.
Patching & Updates: No. We have a local solution anyway.
Logging: No. Appears to work but will not.

没有意义。

有帮助吗?

解决方案 4

没有解决方案。我们去NSIS作为企业的MSI安装将被打破反正由于MSI嵌套问题(只的尝试的EXE安装微星一天内包装MSI)。

其他提示

嗯,有免费方式和$$$方式。我无法在这里记录所有内容,但这应该可以帮助您开始。

顺便说一句,是的,Windows Installer 是一项令人抓狂的技术。很多时候我认为一项任务很简单,但实际上却变得很复杂。你一定要沉浸其中才能理解它。

无论如何,这里是:

自由的:维克斯 (这里)

这是一个免费工具,用于从一组 XML 配置文件生成 MSI 文件。我会让你在网上寻找教程,但关键是:

您可以使用 WXS 文件中的以下标记将 EXE 压缩到安装程序中:

<Binary Id="MYEXE" src="<path to my exe?"/>

然后您可以创建一个启动 EXE 文件的自定义操作:

<CustomAction Id="EXECA_CALLMYEXE" Return="check" Execute="deferred" BinaryKey="MYEXE"
      ExeCommand="my command line"/>

然后将您的自定义操作插入到 InstallExecuteSequence 在适当的位置(我几乎总是在 InstallInitializeInstallFinalize)

<InstallExecuteSequence>
   <Custom Action="EXECA_CALLMYEXE" After="InstallInitialize"><![CDATA[Not REMOVE]]></Custom>

$$$:获取安装盾 (这里)

首先创建一个“Basic MSI”项目并确保你说你想要 没有生成setup.exe. 。您可以在发布设置中进行设置。

然后你基本上会做与 WiX 相同的事情,但你有一个 UI。

  • 您可以使用直接编辑器指定辅助 EXE 文件并将 EXE 文件放入“二进制”表中
  • 您可以创建自定义操作以从左侧树中的“自定义操作”节点启动该 EXE 文件
  • 您可以通过选择“安装序列”并将其放入 InstallExecuteSequence 介于两者之间 InstallInitializeInstallFinalize 正如我之前所说。

抱歉,我无法提供更详细的信息,但这应该是一个好的开始。

我想创建一个.MSI文件的最简单方法是使用维克斯

从维克斯教程

课程1 是所有需要创建一个简单安装。

约书亚,我非常理解你的沮丧。至少可以说,MSI 很古怪——一种全新的部署方式。尽管如此,正确应用 MSI 仍可提供最佳部署,特别是对于企业客户而言。

您的安装程序 EXE 执行哪些操作?它主要是文件复制、一些 COM 注册和一些注册表写入,还是运行复杂的安装逻辑、设置数据库等......?我之所以问这个问题,是因为为您创建一个功能良好的 WIX MSI 可能会非常快,这样您就可以放弃 EXE 方法。

确实可以从 MSI 内部运行 EXE,但它需要正确的排序,而且它肯定会比简单的 MSI 给您带来更多的忧虑。如果应用程序很小,并且在安装过程中没有做任何疯狂的事情,我很乐意为您提供基本的 WIX 转换。

还有href="http://www.exemsi.com/getting-started" rel="nofollow">的MSI包装的自由版本

添加到weir's应答,改变custom action attribute象下面这样:

<!--Run Action-->
    <CustomAction Id="RunWrappedExe"
                  Return="asyncNoWait"
                  FileKey="ApplicationFileId"
                  Execute="deferred"
                  ExeCommand=""
                  HideTarget="no"
                  Impersonate="yes"/>

设置Return=asyncNoWai不等待exe返回。安装程序会对它的工作并正常关闭。同时,连续exe其执行。

-Madhuresh

如果您不想MSI管理,但只是执行EXE,尝试的埃克到MSI转换器免费。你只要把在路径EXE,并得到一个MSI。

尝试这样:

在MSI软件包,有一个行为呼叫“安装后启动应用程序”,这意味着你的exe文件将MSI安装之后执行(该MSI被关闭)。

设法在那里执行你的exe文件,所以当你的EXE调用其它MSI软件包,它不会与第一个冲突。

维克斯可以做到这一点。这是我的示例代码威克斯3.5:

<?xml version='1.0'?>
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>
   <Product Id='*' UpgradeCode="11111111-2222-3333-4444-555555555555" 
        Name='My Setup' Language='1033' Version='1.0.0.0' 
        Manufacturer='Your company'>

    <Package Description='pak' InstallerVersion='200' Compressed='yes' />

    <Media Id='1' Cabinet='setup.cab' EmbedCab='yes' />

    <Directory Id='TARGETDIR' Name='SourceDir'>
        <Directory Id="TempFolder">
            <Directory Id="INSTALLLOCATION" Name="~_tmpdir">
                <Component Id='MyComponent' DiskId='1' Guid=''>
                    <File Id="File0" Name="setup.exe" Source="setup.exe" />
                    <File Id="File1" Name="file1.txt" Source="file1.txt" />
                </Component>
            </Directory>
        </Directory>
    </Directory>

    <Feature Id='InstallFeature' Title='Install Feature' Level='1'>
        <ComponentRef Id='MyComponent' />
    </Feature>

    <!-- Run Action -->
    <CustomAction Id="RunWrapExe" Return="ignore" Execute="deferred" 
                  FileKey="File0" ExeCommand="setup.exe param here"  
                  HideTarget="no" Impersonate="no" />

    <InstallExecuteSequence>
        <Custom Action="RunWrapExe" 
                After="InstallFiles">NOT REMOVE~="ALL"</Custom>
    </InstallExecuteSequence>

   </Product>
</Wix>

我有同样的问题(涡卷EXE,从EXE调用其他MSI包括.NET安装等), 这里是我的解决方案:

我建立使用的InstallAware设置EXE。 它有自己的MSI包装一个包装与MSI所生成的EXE。

它的工作原理确定,EXE可以调用其它的MSI没有任何问题(包括.NET安装程序,其他第三方设置),但是那是因为启动MSI结束(“返回”)的权利它会启动安装程序的EXE文件后,和它们避免递归MSI的MSI限制这种方式呼叫。

BUT - 一些客户(公司)使用MSI部署工具,需要MSI(MSIEXEC)返回(结束)的设置处理结束后,才,那就是与上述解决方案的问题

所以 - 解决这样:

还有另一个MSI包装(exemsi.com),其产生MSI,返回EXE设置结束后,才,但对于使用,必须使用的InstallAware的另一种独特的选项:

的InstallAware有可能产生利用自己的本地引擎的EXE安装程序,而不是基于Windows安装程序引擎,以避免MSI递归限制的选项。 结合这些都和你有完美的解决方案。

希望这会帮助别人,虽然很多年过去了,这一问题被先贴。

简单特技:

项目图片

using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;

namespace Setup
{
    internal class Program
    {
        [DllImport("kernel32.dll")]
        private static extern IntPtr GetConsoleWindow();

        [DllImport("user32.dll")]
        private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        private static void Main(string[] args)
        {
            ShowWindow(GetConsoleWindow(), 0);
            Stream st = Assembly.GetExecutingAssembly().GetManifestResourceStream("Setup.MSI.Temp.msi");
            string path = Path.Combine(System.IO.Path.GetTempPath(), "Temp.msi");
            using (var fileStream = new FileStream(path, FileMode.Create, FileAccess.Write))
            {
                st.CopyTo(fileStream);
            }
            Process p = new Process();
            p.StartInfo.FileName = path;
            p.Start();
            p.WaitForExit();
            File.Delete(path);
        }
    }
}

I(它的使用wixsharp和威克斯)制成的简单和自由.NET工具从EXE或文件夹中创建MSI http://legacy.averbouch.biz/free-msi-wrapper

“屏幕截图”

罗的人,只需要使用创新安装的向导。它使一个EXE安装程序而不是一个MSI。这就像5分钟,你就会有一个Windows安装程序。

只需下载它,安装它,它指向您的EXE文件,并按照屏幕上的提示

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top