- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
为了进行简单的测试,我为一个简单的Winform应用程序创建了一个Wix
安装程序应用程序,如下所示。但是,当我运行用安装程序创建的msi
时,它只运行一秒钟,然后退出而未安装Winform应用程序。问题:这里可能是什么问题?我的Product.wxs
文件中似乎缺少某些内容。注意:我正在使用VS2017
产生问题的步骤
从here安装Wix Toolset Visual Studio 2017 Extension
,并按照他们的指示从here安装WiX 3.11 RC2
创建了一个默认的Winform project
[只是一个表单,没有添加任何内容]
在同一解决方案中使用Wix Setup project
模板创建了Toolset\v3\Setup Project
在WiX安装项目中添加了对Winform项目的引用
构建了整个解决方案。
右键单击安装项目,然后重新构建它,从而在其.msi
文件夹中创建一个\..bin\Debug
文件
双击步骤6中的.msi
文件。文件运行一秒钟,出现Windows 10安装对话框(对于任何询问您是否要安装此程序的安装,该对话框都会出现)。我点击了Yes
。安装程序再次运行一秒钟,然后退出。但是未安装Winform应用程序。
默认的Product.wxs文件[除了在Manufacturer
属性中添加值之外,我没有在此处添加任何内容]
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" Name="SetupProject1" Language="1033" Version="1.0.0.0" Manufacturer="WiX_test_4_Winfrm" UpgradeCode="e69fe67b-5c28-4764-8196-a6613b840eff">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<MediaTemplate />
<Feature Id="ProductFeature" Title="SetupProject1" Level="1">
<ComponentGroupRef Id="ProductComponents" />
</Feature>
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLFOLDER" Name="SetupProject1" />
</Directory>
</Directory>
</Fragment>
<Fragment>
<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
<!-- TODO: Remove the comments around this Component element and the ComponentRef below in order to add resources to this installer. -->
<!-- <Component Id="ProductComponent"> -->
<!-- TODO: Insert files, registry keys, and other resources here. -->
<!-- </Component> -->
</ComponentGroup>
</Fragment>
</Wix>
最佳答案
“ Hello WiX”(请使用透明铝)
我认为您需要的是the "Hello World" of WiX from CodeProject。现在这已经很老了,但是仍然可以很好地向您展示如何编译有效的MSI的基本知识。
更新:下面我添加了有关如何从新的WiX 3 Visual Studio项目中编译MSI的分步说明。
这是从另一个角度回溯的答案,其中包含有关WiX实际含义的一些上下文信息:MSI vs nuget packages: which are is better for continuous delivery?。您还将在此处找到指向“ hello world”的链接,还有其他几个链接。
总结:检查第一个链接以获取WiX的“ hello world”。然后,使用几个测试组件更新源代码并重新编译。您应该掌握Orca(SDK工具)才能查看已编译的MSI文件。由于已安装Visual Studio,请尝试搜索Orca-x86_en-us.msi
并进行安装(这是Microsoft自己的官方MSI查看器和编辑器)。然后在开始菜单中找到Orca。从技术上讲,Orca是作为Windows SDK(不是Visual Studio)的一部分安装的,但是Windows SDK是与Visual Studio安装捆绑在一起的。拥有已编译的MSI文件后,只需右键单击它,然后选择Edit with Orca
。
在这样的文件真正有意义之前,需要一些经验。本质上,它是存储在COM结构化存储文件(OLE)中的原始MS SQL数据库。本质上,文件中的文件系统具有用于不同内容(例如文件和数据表等)的流。只需将其视为具有正常参照完整性的数据库,并首先关注诸如File
和Component
之类的核心表。
最小的WiX MSI编译-分步进行
让我尝试逐步描述如何在新创建的WiX 3项目中使用默认的WiX GUI进行编译。您可以在答案的最后部分看到这些更改“合并”为一个完整的示例,但请逐步阅读此内容,这样才有意义。
创建一个新的WiX3项目。您知道该怎么做,我不会在细节上浪费时间。
将Manufacturer
属性设置为您的公司名称。现在,将您选择的新名称设置为Name
属性。在此示例中,将其设置为MinimalTester
-请使用其他名称。
将<MediaTemplate />
更改为<MediaTemplate EmbedCab="yes" />
以使用MSI中的嵌入式cab文件。这样,仅创建了MSI,并且没有其他外部CAB文件。
在MediaTemplate元素之后,直接添加以下内容:<UIRef Id="WixUI_Mondo" />
。这将向您的MSI添加默认的WiX对话框集,因此它具有更通用的功能所需要的基本知识。现在,您可以运行修复并进行修改,并且会按照大多数MSI文件从Installshield或Advanced Installer或其他专业工具提供的内容进行安装向导。至关重要的是:您的administrative installation将有一个对话框,您可以在其中指定将文件提取到的位置。
我们将自己的许可协议添加到WiX设置中(否则您将得到一个默默无闻的默认协议)。直接在<UIRef Id="WixUI_Mondo" />
之后添加以下元素:<WixVariable Id="WixUILicenseRtf" Value="TestLicenseAgreement.rtf" />
。现在创建文件TestLicenseAgreement.rtf
并将其放置在与主WiX源文件相同的文件夹中(快速方法:在Visual Studio中,右键单击项目,然后单击“在文件资源管理器中打开文件夹”,然后右键单击=>创建RTF文件。新=> RTF文件
。也许打开RTF并输入一些测试文本)。 Further customization of the dialogs(位图及更多)。
WiX对话框集在dll中定义,我们需要引用它。在您的Visual Studio WiX项目中:Right click References => Add Reference... => Navigate to C:\Program Files (x86)\WiX Toolset v3.11\bin\
。双击WixUIExtension.dll
,最后单击OK
。
现在,使用指定为源的绝对路径添加WiX中可能的绝对最小组件。这是为了确保您可以编译MSI。之后,您可以将路径设为相对路径或变量(暂时将其直接添加到INSTALLFOLDER
目录元素下):
<Component Feature="ProductFeature">
<File Source="C:\Users\someone\SourceControl\MyProject\CoreApp.exe" />
</Component>
Build
。右键单击WiX项目并单击
Open Folder in File Explorer
,您可以快速测试运行MSI。现在,双击
bin
,然后双击
Debug
(如果您切换到发行版,则单击“发行版-不确定两个配置之间有什么”默认差异”)。您应该在对话框序列的第二个对话框中看到自己的许可协议。
Component Id
。在编译期间,它默认为其包含的File元素的ID。反过来,
File element Id
也将丢失,并且默认为
Source attribute
指定的文件名(这是必填属性)。
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<!--CHANGE 0: Set Manufacturer attribute to something, you must also specify a full GUID for UpgradeCode -->
<Product Id="*" Name="MinimalTester" Language="1033" Version="1.0.0.0" Manufacturer="My Company" UpgradeCode="PUT-GUID-HERE">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<!--Standard: <MediaTemplate />-->
<!--CHANGE #1: Enable embedded cab files, so there is only one file generated, the MSI file -->
<MediaTemplate EmbedCab="yes" />
<!--CHANGE #2: Add the following elements to link one of the default WiX GUI sequences and show the specified license agreement. The RTF file must be created and placed next to your WiX source file -->
<UIRef Id="WixUI_Mondo" />
<WixVariable Id="WixUILicenseRtf" Value="TestLicenseAgreement.rtf" />
<!--CHANGE #3: Add WiX dll reference. In Visual Studio WiX project: Right click References => Add Reference... => Navigate to C:\Program Files (x86)\WiX Toolset v3.11\bin\. Double click WixUIExtension.dll. Click OK -->
<Feature Id="ProductFeature" Title="MinimalTester" Level="1">
<ComponentGroupRef Id="ProductComponents" />
</Feature>
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLFOLDER" Name="MinimalTester" />
</Directory>
</Directory>
</Fragment>
<Fragment>
<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
<!--CHANGE #4: Remove TODO elements, add the most basic component possible as illustrated below -->
<Component>
<File Source="C:\Users\someone\SourceControl\MyProject\CoreApp.exe" />
</Component>
</ComponentGroup>
</Fragment>
</Wix>
C:\Program Files (x86)\MinimalTester
。
关于c# - WiX安装程序MSI未安装使用Visual Studio 2017创建的Winform应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47970743/
我找到了 this excellent question and answer它以 x/y(加上 center x/y 和 degrees/radians)开始并计算旋转- 到 x'/y'。这个计算很
全部: 我已经创建了一个 Windows 窗体和一个按钮。在另一个线程中,我试图更改按钮的文本,但它崩溃了;但是如果我尝试更改按钮的颜色,它肯定会成功。我认为如果您更改任何 Windows 窗体控件属
本网站的另一个问题已证实,C 中没有缩写的字面后缀,并且可以执行以下操作: short Number = (short)1; 但是转换它和不这样做有什么区别: short Number = 1; 您使
我有下表: ID (int) EMAIL (varchar(50)) CAMPAIGNID (int) isSubscribe (bit) isActionByUser (bit) 此表存储了用户对事
也就是说,无需触发Javascript事件即可改变的属性,如何保留我手动选中或取消选中的复选框的状态,然后复制到另一个地方? 运行下面的代码片段并选中或取消选中其中的一些,然后点击“复制”: $('#
我在网上找到的所有关于递增指针导致段错误的示例都涉及指针的取消引用 - 如果我只想递增它(例如在 for 循环的末尾)并且我不在乎它是否最终进入无效内存,因为我不会再使用它。例如,在这个程序中,每次迭
我有一个 Spring MVC REST 服务,它使用 XStream 将消息与 XML 相互转换。 有什么方法可以将请求和响应中的 xml(即正文)打印到普通的 log4j 记录器? 在 Contr
做我的任务有一个很大的挑战,那就是做相互依赖的任务我在这张照片中说的。假设我们有两个任务 A 和 B,执行子任务 A1、A2 和 B1、B2,假设任务 B 依赖于 A。 要理想地执行任务 B,您应该执
通过阅读该网站上的几个答案,我了解到 CoInitialize(Ex) should be called by the creator of a thread 。然后,在该线程中运行的任何代码都可以使
这个问题已经困扰我一段时间了。我以前从未真正使用过 ListViews,也没有使用过 FirebaseListAdapters。我想做的就是通过显示 id 和用户位置来启动列表的基础,但由于某种原因,
我很难解释这两个(看似简单)句子的含义: “受检异常由编译器在编译时检查” 这是什么意思?编译器检查是否捕获了所有已检查的异常(在代码中抛出)? “未经检查的异常在运行时检查,而不是编译时” 这句话中
我有一个包含排除子字符串的文本文件,我想迭代该文件以检查并返回不带排除子字符串的输入项。 这里我使用 python 2.4,因此下面的代码可以实现此目的,因为 with open 和 any 不起作用
Spring 的缓存框架能否了解请求上下文的身份验证状态,或者更容易推出自己的缓存解决方案? 最佳答案 尽管我发现这个用例 super 奇怪,但您可以为几乎任何与 SpEL 配合使用的内容设置缓存条件
我有以下函数模板: template HeldAs* duplicate(MostDerived *original, HeldAs *held) { // error checking omi
如果我的应用程序具有设备管理员/设备所有者权限(未获得 root 权限),我如何才能从我的应用程序中终止(或阻止启动)另一个应用程序? 最佳答案 设备所有者可以阻止应用程序: DevicePolicy
非常简单的问题,但我似乎无法让它正常工作。 我有一个组件,其中有一些 XSLT(用于导航)。它通过 XSLT TBB 使用 XSLT Mediator 发布。 发布后
我正在将一个对象拖动到一个可拖放的对象内,该对象也是可拖动的。放置对象后,它会嵌套在可放置对象内。同样,如果我将对象拖到可放置的外部,它就不再嵌套。 但是,如果我经常拖入和拖出可放置对象,则可拖动对象
我正在尝试为按钮和弹出窗口等多个指令实现“取消选择”功能。也就是说,我希望当用户单击不属于指令模板一部分的元素时触发我的函数。目前,我正在使用以下 JQuery 代码: $('body').click
我从 this question 得到了下面的代码,该脚本用于在 Google tasks 上更改 iframe[src="about:blank"] 内的 CSS使用 Chrome 扩展 Tempe
我有一些 @Mock 对象,但没有指定在该对象上调用方法的返回值。该方法返回 int (不是 Integer)。我很惊讶地发现 Mockito 没有抛出 NPE 并返回 0。这是预期的行为吗? 例如:
我是一名优秀的程序员,十分优秀!