如何制作一个简单包装 EXE 文件的 MSI
-
21-08-2019 - |
题
经过大量实验后,我得出的结论是 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
在适当的位置(我几乎总是在 InstallInitialize
和 InstallFinalize
)
<InstallExecuteSequence>
<Custom Action="EXECA_CALLMYEXE" After="InstallInitialize"><![CDATA[Not REMOVE]]></Custom>
$$$:获取安装盾 (这里)
首先创建一个“Basic MSI”项目并确保你说你想要 没有生成setup.exe. 。您可以在发布设置中进行设置。
然后你基本上会做与 WiX 相同的事情,但你有一个 UI。
- 您可以使用直接编辑器指定辅助 EXE 文件并将 EXE 文件放入“二进制”表中
- 您可以创建自定义操作以从左侧树中的“自定义操作”节点启动该 EXE 文件
- 您可以通过选择“安装序列”并将其放入
InstallExecuteSequence
介于两者之间InstallInitialize
和InstallFinalize
正如我之前所说。
抱歉,我无法提供更详细的信息,但这应该是一个好的开始。
约书亚,我非常理解你的沮丧。至少可以说,MSI 很古怪——一种全新的部署方式。尽管如此,正确应用 MSI 仍可提供最佳部署,特别是对于企业客户而言。
您的安装程序 EXE 执行哪些操作?它主要是文件复制、一些 COM 注册和一些注册表写入,还是运行复杂的安装逻辑、设置数据库等......?我之所以问这个问题,是因为为您创建一个功能良好的 WIX MSI 可能会非常快,这样您就可以放弃 EXE 方法。
确实可以从 MSI 内部运行 EXE,但它需要正确的排序,而且它肯定会比简单的 MSI 给您带来更多的忧虑。如果应用程序很小,并且在安装过程中没有做任何疯狂的事情,我很乐意为您提供基本的 WIX 转换。
添加到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文件,并按照屏幕上的提示