Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用Wix的技巧和提示有哪些?

使用Wix的技巧和提示有哪些?

提问于 2018-02-06 17:10:12
回答 10关注 0查看 2K

我想知道在以下方面使用Wix的有效建议:

  • 设置Wix项目(布局、引用、文件模式)
  • 将Wix集成到解决方案中,并构建/发布过程
  • 为新安装和升级配置安装程序
  • 以及你想要分享的关于Wix的优点

回答 10

Rom_z

发布于 2018-02-07 02:44:05

事实上,你可以创建一个自定义MSBuild任务来执行T4模板,并且该模板需要在编译Wix项目之前输出WXS。这允许你自动包含编译另一个解决方案的所有程序集输出(这意味着你在添加新程序集时不再需要编辑WXS)。

goodbad

发布于 2018-02-07 01:12:13

以下技巧是关于在单独的Wix片段中定义可重用的ComponentGroup定义:

目录混叠

组件组片段不需要知道主要产品wxs定义的目录:

代码语言:javascript
运行
AI代码解释
复制
<DirectoryRef Id="component1InstallFolder">
...
</DirectoryRef>

然后,主产品可以将其中一个目录(例如:“productInstallFolder”)按照以下代码进行修改

代码语言:javascript
运行
AI代码解释
复制
<Directory Id="productInstallFolder" Name="ProductName">
   <!-- not subfolders (because no Name attribute) but aliases for parent! -->
   <Directory Id="component1InstallFolder"/> 
   <Directory Id="component2InstallFolder"/> 
</Directory>

依赖关系图

ComponentGroup元素可以包含ComponentGroupRef子元素。如果你有大量的可重用组件池,并且在它们之间有一个复杂的依赖关系图,只需要为每个组件在自己的片段中设置ComponentGroup,并声明如下所示的依赖关系:

代码语言:javascript
运行
AI代码解释
复制
<ComponentGroup Id="B">
   <ComponentRef Id="_B" />
   <ComponentGroupRef Id="A">
</ComponentGroup>

如果现在在你的设置中引用组件组“B”,因为它是你的应用程序的直接依赖项,那么即使应用程序作者从未意识到它是“B”的依赖项,它也会自动地将组件组“A”参与进来。只要你没有任何循环依赖项,它就可以“工作”。

可重用wixlib

如果使用lit.exe将大型池可重用组件编译为可重复使用的wixlib,上述依赖关系图想法效果最佳。 创建应用程序设置时,可以像wixobj文件一样引用此wixlib。 candle.exe链接器将自动消除任何未被主要产品wxs文件“拉入”的片段。

BlackKnight

发布于 2018-02-07 00:35:53

Javascript CustomActions

JavaScript用于MSI自定义操作是错误的原因主要是:很难调试,并且不可靠。实际上,调试并不难,只是和C++不一样。在Javascript中编写CustomActions非常容易,比C++容易,快速,并且可靠。

但是有一个缺点:JavaScriptCustomActions可以通过Orca提取,而C/C++CA则需要reverse-engineering。

使用脚本,只需从某种结构开始。

CustomAction的JavaScript“样板”代码:

代码语言:javascript
运行
AI代码解释
复制
//
// CustomActions.js 
// 
// Template for WIX Custom Actions written in Javascript.
// 
// 
// Mon, 23 Nov 2009  10:54
// 
// ===================================================================


// http://msdn.microsoft.com/en-us/library/sfw6660x(VS.85).aspx
var Buttons = {
        OkOnly           : 0,
        OkCancel         : 1,
        AbortRetryIgnore : 2,
        YesNoCancel      : 3
};

var Icons = {
        Critical         : 16,
        Question         : 32,
        Exclamation      : 48,
        Information      : 64
};

var MsgKind = {
        Error            : 0x01000000,
        Warning          : 0x02000000,
        User             : 0x03000000,
        Log              : 0x04000000
};

// http://msdn.microsoft.com/en-us/library/aa371254(VS.85).aspx
var MsiActionStatus = {
        None             : 0,
        Ok               : 1, // success
        Cancel           : 2,
        Abort            : 3,
        Retry            : 4, // aka suspend?
        Ignore           : 5  // skip remaining actions; this is not an error.
};


function MyCustomActionInJavascript_CA() {
    try {
        LogMessage("Hello from MyCustomActionInJavascript");
        // ...do work here...
        LogMessage("Goodbye from MyCustomActionInJavascript");
    }
    catch (exc1) {
        Session.Property("CA_EXCEPTION") = exc1.message ;
        LogException(exc1);
        return MsiActionStatus.Abort;
    }
    return MsiActionStatus.Ok;
}

// Pop a message box.  also spool a message into the MSI log, if it is enabled. 
function LogException(exc) {
    var record = Session.Installer.CreateRecord(0);
    record.StringData(0) = "CustomAction: Exception: 0x" + decimalToHexString(exc.number) + " : " + exc.message;
    Session.Message(MsgKind.Error + Icons.Critical + Buttons.btnOkOnly, record);
}


// spool an informational message into the MSI log, if it is enabled. 
function LogMessage(msg) {
    var record = Session.Installer.CreateRecord(0);
    record.StringData(0) = "CustomAction:: " + msg;
    Session.Message(MsgKind.Log, record);
}


// http://msdn.microsoft.com/en-us/library/d5fk67ky(VS.85).aspx
var WindowStyle = {
    Hidden : 0,
    Minimized : 1,
    Maximized : 2
};

// http://msdn.microsoft.com/en-us/library/314cz14s(v=VS.85).aspx
var OpenMode = {
    ForReading : 1,
    ForWriting : 2,
    ForAppending : 8
};

// http://msdn.microsoft.com/en-us/library/a72y2t1c(v=VS.85).aspx
var SpecialFolders = {
    WindowsFolder : 0, 
    SystemFolder :  1, 
    TemporaryFolder : 2
};

// Run a command via cmd.exe from within the MSI
function RunCmd(command)
{
    var wshell = new ActiveXObject("WScript.Shell");
    var fso = new ActiveXObject("Scripting.FileSystemObject");
    var tmpdir = fso.GetSpecialFolder(SpecialFolders.TemporaryFolder);
    var tmpFileName = fso.BuildPath(tmpdir, fso.GetTempName());

    LogMessage("shell.Run("+command+")");

    // use cmd.exe to redirect the output
    var rc = wshell.Run("%comspec% /c " + command + "> " + tmpFileName, WindowStyle.Hidden, true);
    LogMessage("shell.Run rc = "  + rc);

    // here, optionally parse the output of the command 
    if (parseOutput) {
        var textStream = fso.OpenTextFile(tmpFileName, OpenMode.ForReading);
        while (!textStream.AtEndOfStream) {
            var oneLine = textStream.ReadLine();
            var line = ParseOneLine(oneLine);
                ...
        }
        textStream.Close();
    }

    if (deleteOutput) {
        fso.DeleteFile(tmpFileName);
    }

    return {
        rc : rc,
        outputfile : (deleteOutput) ? null : tmpFileName
    };
}

然后,使用以下内容注册自定义操作:

代码语言:javascript
运行
AI代码解释
复制
<Fragment>
  <Binary Id="IisScript_CA" SourceFile="CustomActions.js" />

  <CustomAction Id="CA.MyCustomAction"
              BinaryKey="IisScript_CA"
              JScriptCall="MyCustomActionInJavascript_CA"
              Execute="immediate"
              Return="check" />
</Fragmemt>

当然,您可以根据需要插入尽可能多的Javascript函数,以执行多个自定义操作。 举个例子:我用Javascript在IIS上做了一个WMI查询,以获得一个可以安装ISAPI过滤器的现有网站列表。 这个列表用来填充稍后在UI序列中显示的列表框。

在IIS 7上,IIS没有WMI提供程序,所以我使用了shell.Run()方法调用appcmd.exe来执行工作。

关于Javascript CustomActions

和开发者交流更多问题细节吧,去 写回答
相关文章
焊缝跟踪有哪些方法和技巧
我国是一个制造业大国,工业的发展近些年很是迅速,机械智能化慢慢的开始代替人工,其中机器人焊接的应用很广泛,虽然无法做到完全取代人工,但是在工业生产的实际使用中,越来越多的批量焊接作业都开始了自动化的升级改造。焊接机器人有着更高的效率,焊接质量也有保障,并且不存在情绪问题方便管理,这都让企业们爱不释手,但是,针对不少高精度要求的焊接工件,机器人本身是难以胜任的,这时候就必须用激光焊缝跟踪系统来辅助。
创想智控
2023/02/11
3090
焊缝跟踪有哪些方法和技巧
面试应答有哪些话术和技巧?
是想通过这个问题知道,你是否愿意长期在公司干下去,还想知道你的职业规划是什么,毕竟面试官喜欢有明确目标的人。
猴子数据分析
2021/06/10
9670
面试应答有哪些话术和技巧?
是想通过这个问题知道,你是否愿意长期在公司干下去,还想知道你的职业规划是什么,毕竟面试官喜欢有明确目标的人。
猴子聊数据分析
2020/08/14
5230
干掉 “重复代码” 的技巧有哪些
软件工程师和码农最大的区别就是平时写代码时习惯问题,码农很喜欢写重复代码而软件工程师会利用各种技巧去干掉重复的冗余代码。
每周聚焦
2023/01/03
4500
深度学习调参有哪些技巧?
最近因为一些需要,参与了一些CNN建模调参的工作,出于个人习性,我并不习惯于通过单纯的trial-and-error的方式来调试经常给人以”black-box”印象的Deep Learning模型,所以在工作推进过程中,花了一些时间去关注了深度学习模型调试以及可视化的资料(可视化与模型调试存在着极强的联系,所以在后面我并没有对这两者加以区分),这篇文章也算是这些工作的一个阶段性总结。 这里总结的内容,对于模型高手来说,应该说都是基本的know-how了。 我本人是计算机体系结构专业出身,中途转行做算法策略,所以实际上我倒是在大规模机器学习系统的开发建设以及训练加速方面有更大的兴趣和关注。不过机器学习系统这个领域跟常规系统基础设施(比如Redis/LevelDB以及一些分布式计算的基础设施等)还有所区别,虽然也可以说是一种基础设施,但是它跟跑在这个基础设施上的业务问题有着更强且直接的联系,所以我也会花费一定的精力来关注数据、业务建模的技术进展和实际问题场景。 说得通俗一些,对自己服务的业务理解得更清晰,才可能设计开发出更好的算法基础设施。 另外在进入文章主体之前想声明的是,这篇文章对于Deep Learning的入门者参考价值会更高,对于Deep Learning老手,只期望能聊作帮助大家技术总结的一个余闲读物而已。 文章的主要内容源于Stanford CS231n Convolutional Neural Networks for Visual Recognition课程[1]里介绍的一些通过可视化手段,调试理解CNN网络的技巧,在[1]的基础上我作了一些沿展阅读,算是把[1]的内容进一步丰富系统化了一下。限于时间精力,我也没有能够把里面提到的所有调试技巧全部进行尝试,不过在整理这篇文章的时候,我还是参考了不止一处文献,也结合之前以及最近跟一些朋友的技术交流沟通,对这些方法的有效性我还是有着很强的confidence。 1.Visualize Layer Activations 通过将神经网络隐藏层的激活神经元以矩阵的形式可视化出来,能够让我们看到一些有趣的insights。 在[8]的头部,嵌入了一个web-based的CNN网络的demo,可以看到每个layer activation的可视化效果。
CreateAMind
2018/07/25
7790
深度学习调参有哪些技巧?
WiX和DTF介绍
Windows Installer XML(WiX) 这里所介绍的是Wix 3.0版本,目前还是beta. Wix 是 Windows Installer XML 的缩写,它是微软提供的一组工具和规范的集合,用来制作MSI格式的安装包。另外值得一提的是,Wix是微软少有的开源软件之一。 制作MSI的工作有InstallShield,Wise,他们都是商业程序,需要付费,你也可以使用WiX来完成安装程序制作。WiX和这些MSI的工具比较有不同的地方: 它完全用xml描述,使用命令行来生成,这非常容易整合到开发
张善友
2018/01/29
1.1K0
有哪些不定积分的运算(心算)技巧?[1]
计算不定积分实际上就是根据导函数找原函数。求导的计算方法有一定的套路,对于任给的初等函数都套这些求导法则都可以找到导函数。但是不定积分不然。不定积分的两种运算律——换元积分法和分部积分法——都只是告诉你你可以怎么算,但是并没说这么算一定能算出来。因此,不定积分的计算有十分强的技巧性。
云深无际
2021/04/14
1.9K0
有哪些不定积分的运算(心算)技巧?[1]
(转) Laravel Eloquent 提示和技巧
原文:https://learnku.com/articles/19876#1face4 Eloquent ORM 看起来像一个简单的机制,但在幕后,有很多半隐藏的功能和不太知名的方法来实现更多。在本文中,我将向您展示一些技巧。
mafeifan
2019/03/12
1.6K0
(转) Laravel Eloquent 提示和技巧
iis7上常见的php错误提示有哪些
这篇“iis7上常见的php错误提示有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“iis7上常见的php错误提示有哪些”文章吧。
会长君
2023/04/26
8280
国产WEB扫描器北极熊有哪些使用技巧?
【北极熊扫描器】到目前为止已经度过了3个年头,作者一直在学习中,坚持更新软件,改进程序,修正BUG,那么接下来我将给大家介绍一下,【北极熊扫描器】这款软件怎么玩?这么玩得“6”,作为国产WEB扫描器他
FB客服
2018/02/07
1.1K0
国产WEB扫描器北极熊有哪些使用技巧?
干货 | 深度学习调参有哪些技巧?
本文将分享一些自己关于深度学习模型调试技巧的总结思考(以CNN为主)。 最近因为一些需要,参与了一些CNN建模调参的工作,出于个人习性,我并不习惯于通过单纯的trial-and-error的方式来调试经常给人以”black-box”印象的Deep Learning模型。所以在工作推进过程中,花了一些时间去关注了深度学习模型调试以及可视化的资料(可视化与模型调试存在着极强的联系,所以在后面我并没有对这两者加以区分),这篇文章也算是这些工作的一个阶段性总结。 这里总结的内容,对于模型高手来说,应该说都是基本的k
AI研习社
2018/03/29
1.4K0
干货 | 深度学习调参有哪些技巧?
有哪些应届生需要留心的面试技巧?
是想通过这个问题知道,你是否愿意长期在公司干下去,还想知道你的职业规划是什么,毕竟面试官喜欢有明确目标的人。
猴子数据分析
2021/03/28
4760
服务器安全维护的技巧有哪些呢
对企业来说,服务器上的数据是非常宝贵,如果数据库丢失了,损失是非常巨大的,因此,企业需对数据进行定期维护服务器安全,以防万一。一般企业都需要每天对服务器上的数据进行备份,而且要将备份数据放置在不同服务器上,数据需要备份,同样需要防盗。可以通过密码保护好磁带并且如果你的备份程序支持加密功能,你还可以加密这些数据。同时,要定好备份时间,通常备份的过程会选择在晚上10点以后进行,到半夜结束。
用户9973510
2022/10/31
2.2K0
渗透测试的目的是什么?有哪些测试技巧?
说到渗透测试,可能很多人对渗透测试并没有很好的了解,毕竟渗透测试根本就没有标准的定义,按照国外一些安全组织达成的共识来说的话,渗透测试就是通过模拟恶意黑客的常用攻击方法,来对计算机网络系统安全做一下评估,这个只是一种对系统安全的评估方法。那么渗透测试的目的是什么?有哪些测试技巧?
用户8739405
2021/07/09
3.3K0
学JAVA有哪些好的技巧方法?干货分享
作为编程语言届的老大哥,学习JAVA的人数不胜数,在这里分享一些学习JAVA的技巧以及方法,当然,这些技巧及方法使用范围包含但不限于JAVA. ① 笔记软件 印象笔记:多端互通很方便(https://
兮动人
2021/06/11
6970
制作有吸引力的PPT技巧都有哪些
很多人都抱怨自己的幻灯片做不好,其实是你没掌握技巧。一个好的PPT,是需要内容和画面相互配合的,光有内容而没有画面,PPT就容易变得很单调,但光有画面而没有内容,PPT就会变得空洞。想要做好PPT还是需要一些小技巧的,下面iSlide就来分享给大家。
纸醉金迷i
2022/03/03
8390
制作有吸引力的PPT技巧都有哪些
有哪些你不知道的阅读源码的技巧
优秀的开源组件官方都会维护文档和架构图,这份架构图上或许有一些最重要的组件之间的关联关系、或许哪些功能的调用流程、或许有一些别的东西,但是相信我,这些东西一定都是从总体来描述这个项目的,这个一定是你要阅读源码时第一个要看的
Java学习录
2019/09/10
4440
有哪些你不知道的阅读源码的技巧
Dubbo 的使用场景有哪些?
Dubbo是一个高性能、轻量级的Java RPC远程通讯框架,它主要用于分布式服务架构中,解决了服务之间的远程调用问题。以下是Dubbo的主要使用场景:
疯狂的KK
2023/05/01
1.6K0
Dubbo 的使用场景有哪些?
Hadoop的优点和缺点有哪些?
2、Hadoop通过可用的计算机集群分配数据,完成存储和计算任务,这些集群可以方便地扩展到数以千计的节点中,具有高扩展性。
加米谷大数据
2019/04/19
4.7K0
Hadoop的优点和缺点有哪些?
点击加载更多

相似问题

【有奖问答】你有哪些数据库优化技巧?(已完结)

13717

我应该使用哪些锁提示(T-SQL)?

2135

roomService后台相关表有哪些,对应的字段有哪些?

0177

常见的游戏作弊工具和作弊方法有哪些?

5885

默认脏字有哪些?

0279
相关问答用户
腾讯云TDP | TDP会员擅长3个领域
平安资管 | 架构师擅长4个领域
擅长3个领域
擅长5个领域
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档