FeNiX 的个人资料FeNiX's Amazing Grace照片日志列表更多 ![]() | 帮助 |
|
2007/11/23 Visual Studio安装项目学习笔记 项目组要开发一个插件,schedule很紧,安装程序由我负责。本来是想用NSIS来做的,原型都做好了,上头却以各种各样的理由否决了,于是只剩下3个途径(只考虑免费的或者已经有license的工具)——WiX(Windows Install XML)、InstallShield和Visual Studio安装项目。WiX很强大,用起来本应是和NSIS差不多的(除了一个是用XML另一个是用脚本语言),但前者因缺乏各种辅助工具、插件、sample code而显得难以上手,希望WixEdit和WiX 3.0会以后完善点吧。从零开始学WiX还不如学InstallShield,因为后者不少同事懂,不过据说bug比较多。从schedule考虑只能用VS了,customizability差一些,以后有时间的话学了InstallShield可以考虑重做。 一、需求 二、建立安装项目 三、安装界面 四、注册表 五、自定义操作 我选择第3种方式,也就是使用Custom Actions,具体方法是在主项目的系统服务主类的Design视图中右击空白部分选择Add Installer。生成一个System.Configuration.Install.Installer的子类ProjectInstaller,打开其Design视图可以看见两个 component,分别设置相应属性。当然也可以用一般的方式生成Installer子类——右击项目添加Installer类,然后在构造方法中构造 System.ServiceProcess.ServiceProcessInstaller和System.ServiceProcess.ServiceInstaller组件。 比如在安装完毕后启动服务就可以通过重写OnAfterInstall方法实现。添加卸载程序快捷方式需要在Install和Uninstall两个Custom Action的CustomActionData属性里输入“/productcode=[ProductCode] /productname= [ProductName]”,并在项目中添加对Windows Script Host Object Model的Reference以及using IWshRuntimeLibrary,代码(参考了这篇post)如下: System.Collections.Specialized.StringDictionary parameters = this.Context.Parameters;
string pc = parameters["productcode"];
string pn = parameters["productname"];
string programShortcutFolder = String.Format(@"{0}\{1}",
Environment.GetFolderPath(Environment.SpecialFolder.Programs),
pn
);
WshShell shell = new WshShell();
if (!Directory.Exists(programShortcutFolder))
Directory.CreateDirectory(programShortcutFolder);
IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(
programShortcutFolder + @"\Uninstall.lnk"
);
shortcut.TargetPath = Environment.GetFolderPath(Environment.SpecialFolder.System) + @"\msiexec.exe";
shortcut.WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.System);
shortcut.WindowStyle = 1;
shortcut.Description = "Description blah blah blah";
shortcut.IconLocation = Environment.GetFolderPath(Environment.SpecialFolder.System) + @"\msiexec.exe";
shortcut.Arguments = "/x " + pc;
shortcut.Save();
}
public override void Uninstall(System.Collections.IDictionary savedState)
{
base.Uninstall(savedState);
System.Collections.Specialized.StringDictionary parameters = this.Context.Parameters;
string pn = parameters["productname"];
string programShortcutFolder = String.Format(@"{0}\{1}",
Environment.GetFolderPath(Environment.SpecialFolder.Programs),
pn
);
if (Directory.Exists(programShortcutFolder))
Directory.Delete(programShortcutFolder,true);
} 六、遗留问题 P.S. 我一开始没想到向Custom Action传参数,想通过读sln和vdproj文件来获取ProductCode和ProductName,找到了一下几篇文章,还蛮好玩的: 2007/11/19 OUAT & UNO 绵羊同学上周末按计划过来聚,我把Yimo同学也拉了过来。这次玩得比上周爽多了,因为安排好了行程,Once Upon A Time和UNO牌也准备好了。我准备的“按摩棒”要素卡果然很有效果,带动全场气氛~
唯一遗憾的是没从公司借到Wii Sports,借来的Wii又没有装Wiikey,只能玩《はじめてのWii》。这就算了,玩的时候还发现里面没有电池,时间又太晚超市都关了。好不容易才找到两节电池,那游戏双打应该还是不错的说……
晚上吃饭的时候本来是想补下RGP项目同志的BG和答谢舍友的,可惜WHS和HC同学没办法来……少给两份钱yeah
果然两三个人晚上一起玩的话Wii才是王道啊,连一直对Wii不抱希望的FX同学都有兴趣起来了呵呵~PS2游戏就不用大家推荐了
附上OUAT材料:
2007/11/12 綿ちゃん、突然来るのはもうやめてくれないかな>_<本来说好这个周末过来聚的,绵羊同学上周末突然跑过来(对,已经不是第一次了,严重打破我的计划),UNO牌和Once Upon A Time材料都没准备好,只好去街机和唱K了
爽快的是新街口那店有太鼓10了,“晴れハレ”和“もってけ”万岁~虽然比较贵(¥1两歌 compared with ¥0.5三歌 in 太鼓8)
郁闷的是盛哥掉了¥500现金和两张银行卡,本人对该同学的遭遇深表同情并致以亲切的慰问,amen……
P.S. 哪位同学推荐一下容易上手比较快热的PS2游戏吧,经常有同学在我这借宿一宵却不知道玩什么好,来来去去就是无双、高达、KOFMIA和GPX,其他碟基本都是RPG和战棋,羞赧 |
|
|