感谢StackOverflow,我昨天发现如何在Visual Studio安装程序中添加自定义操作以在更新后启动我的程序.我现在面临的问题是,在安装程序结束时程序打开但安装程序永远不会完成,直到我退出我的应用程序.
有没有办法确保应用程序仅在用户单击MSI包上的完成后启动?或者程序在安装程序完成时启动但安装程序完成并退出?
我正在运行Visual Studio 2010以防万一.
installer windows-installer custom-action visual-studio-2010
我有一个自定义操作,通过Windows Installer从受信任的根证书添加/删除证书.我通过使用CustomAction实现了这一点
用户可能没有权限将证书添加到TrustedRoots,或者他们可能选择"取消",如何回滚以前的操作,并告诉安装程序我已取消该过程?
现在,Windows Installer即使失败也始终报告成功响应.
如果我在产品块中编写下面的代码然后它工作正常但如果我在一个单独的文件中写它然后它不工作.
请有人能告诉我为什么会发生这件事吗?
这是自定义操作的单独文件代码:
<?xml version="1.0" encoding="UTF-8"?>
<?include SetupDefines.wxi?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<!-- The custom action DLL itself.-->
<Binary Id="CA" SourceFile="..\bin\debug\Name.CA.dll" />
<CustomAction Id="CustomAction1"
BinaryKey="CA"
DllEntry="CustomAction1"
Execute="immediate"
Return="check" />
<!--Custom Actions END-->
<InstallExecuteSequence>
<Custom Action="CustomAction1" Before="InstallFiles">
<![CDATA[NOT Installed]]>
</Custom>
</InstallExecuteSequence>
</Fragment>
</Wix>
Run Code Online (Sandbox Code Playgroud) 我应该需要在文件安装开始之前运行 C++ wix 自定义操作。是否可以?我的代码是
<InstallUISequence>
<Custom Action ="_EE10247D_B1B7_42F9_8BC9_A973E5755689" Before ="InstallFiles"></Custom>
</InstallUISequence>
<CustomAction Id="_EE10247D_B1B7_42F9_8BC9_A973E5755689" Execute="deferred" Impersonate="no" FileKey="FileDllId" adx:VSName="GuidAutoGen" DllEntry="GuidAutoGen" />
Run Code Online (Sandbox Code Playgroud)
但错误消息是“错误 LGHT0094:“产品:{C095BA7A-0E1E-4679-AAC0-3C17C82BC5EA}”部分中对符号“WixAction:InstallUISequence/InstallFiles”的引用未解析”
怎么了?
如何让Wix在最终的MSI中包含一个没有行的CustomTable?如果我只是像这样定义表
<CustomTable Id="MyTable">
<Column Id="Id" Type="string" Category="Identifier" PrimaryKey="yes"/>
<Column Id="Root" Type="string"/>
<Column Id="Key" Type="string"/>
<Column Id="Name" Type="string"/>
</CustomTable>
Run Code Online (Sandbox Code Playgroud)
Wix在最终输出中省略了它.
我的DTF CustomAction期望它在那里,以便它可以在执行期间向它添加行.
有任何想法吗?
我有以下CustomAction:
<CustomAction Id="ActionName"
After="InstallFinalize">
<![CDATA[NOT Installed AND (VSTORUNTIME4="#1")]]>
</CustomAction>
Run Code Online (Sandbox Code Playgroud)
问题是当我返回ActionResult.Failure时,CustomAction中存在一个案例.在这种情况下,安装程序将显示错误消息并说安装失败,但应用程序仍然部分安装(文件已经在Program Files中,应用程序显示在卸载程序中).
我希望如果我返回ActionResult.Failure,那么安装将被中止并卸载.如果自定义操作在默认的Visual Studio安装程序中失败,会发生这种情况,我认为这更有意义.
如果自定义操作失败,有人知道如何触发卸载吗?我是否需要为WiX XML添加额外的东西?
我正在尝试编写ac#自定义操作并使用.Net 2,但是我似乎无法让事情发挥作用.我相信MSI使用的是错误的CLR版本.我在日志文件中看到MSI正在调用我的CA的几行(如果我注释掉我的CA,则不会出现换行符):
SFXCA: Binding to CLR version v4.0.30319.
Run Code Online (Sandbox Code Playgroud)
我的自定义操作似乎没有加载(假设我没有看到任何日志消息).我正在使用Wiz 3.6.3014.0.是否支持或Windows Installer是否只使用计算机上可用的最新运行时?
谢谢
如何仅在安装中断或错误完成时才对自定义操作执行排序?
是否有任何Windows安装程序属性返回当前安装状态(失败/成功)?
我正在使用Wix为ASP.NET MVC Web应用程序创建安装程序,我需要在站点中的特定文件夹上设置IIS_WPG的写入权限.我找到了一个如何使用cacls.exe执行此操作的示例(我认为,仍然没有工作):
<CustomAction Id="PermissionAppData" Directory="TARGETDIR"
ExeCommand=""[SystemFolder]cacls.exe"
"[INSTALLDIR]\Content\uploads"
/T /E /G IIS_WPG:M" Return="check" />
Run Code Online (Sandbox Code Playgroud)
但是,我听说这PermissionEx更好,因为它修改ACL而不是覆盖,(虽然这里的/ E修饰符声称做同样的事情?)所以我更愿意使用它,如果可能的话.我可以PermissionEx在安装目录和所有子文件夹上找到设置权限的唯一示例- 我不想这样做.
如何使用PermissionEx来修改一个文件夹的权限之内我的安装文件夹?
好的,这是我到目前为止所得到的 - 基于Yan在下面的答案以及在线的其他一些例子
我的文件夹结构......
<Fragment>
<!-- Will default to C:\ if that is the main disk-->
<Property Id="ROOTDRIVE"><![CDATA[C:\]]></Property>
<Directory Id="TARGETDIR" Name="SourceDir">
<!-- Will reference to C:\inetpub-->
<Directory Id="INETPUB" Name="Inetpub">
<!-- Will reference to c:\Inetpub\wwwroot-->
<Directory Id="WWWROOT" Name="wwwroot">
<!-- Will reference to c:\Inetpub\wwwroot\Demowebsite-->
<Directory Id="INSTALLFOLDER" Name="DemoWebsite">
<Directory Id="CONTENT" Name="Content">
<Directory Id="UPLOAD" Name="upload">
</Directory>
</Directory> …Run Code Online (Sandbox Code Playgroud) 为什么限制在我的WiX/MSI设置中使用自定义操作是个好主意?
部署是大多数开发的关键部分.请给这个内容一个机会.我坚信,通过应用程序设计的微小变化可以显着提高软件质量,使部署更加合理,更可靠 - 这就是"答案"的全部 - 软件开发.
这是一个Q/A风格的问题,从一个过长的答案中分离出来:如何避免我的WiX/MSI部署解决方案中的常见设计缺陷?.