Winform 安装包 卸载 自动注册DLL到GAC
来源:互联网 发布:js压缩成一行 编辑:程序博客网 时间:2024/05/04 11:34
先说说我的需求:
目前有一个winform程序,需要制作一个安装包,关键是在程序安装完毕后将安装目录下的一个 dll注册到gac 中。
接下来一步一步走
1. 新建项目—选择左侧其他项目类型下的安装和部署中的Visual Studio Installer – 选择右侧的安装项目,选好路径,设置名称单击确定
2. 在当前项目右键视图—文件系统--应用程序文件夹上右键 添加—文件,选择需要部署winform程序debug下的所有文件,然后添加一个msiexec.exe文件,该文件路径在C盘—Windows—System32下(卸载程序用),同时添加一个启动程序的icon图标和一个卸载的icon图标
3. 将程序显示在开始菜单中:在当前项目右键视图—文件系统—用户的”程序”菜单,添加一个文件夹,取程序相关的名称,然后在该文件夹下右侧右键 – 创建新的快捷方式—在双击应用程序文件夹的可执行程序 单击确定,这个作为启动程序,然后再添加一个快捷方式,选择应用程序文件夹下的msiexec.exe作为卸载程序,名字可随意改.
4. 将程序显示在用户桌面中:在当前项目右键视图—文件系统—用户桌面,添加快捷方式,选择应用程序文件夹的可执行程序.
5. 设置启动程序和卸载程序的图标:在刚设置的启动程序和卸载程序中,右键,属性窗口,其中有个Icon属性,选择应用程序文件夹下您添加的对应的图标.
6. 实现卸载程序:在当前项目右键视图—文件系统—用户的”程序”菜单—您刚添加的名称—卸载程序—右键属性窗口—其中有个属性 Arguments 设置值为 /x {4458FCB5-91C5-4FFC-8B15-E636FB452220},后面括号中的一串是怎么得到的呢,单击当前项目,查看属性窗口,注意不是项目右键中的属性,这是2个不同的。其中有个ProductCode 对,就是这个,Copy过去。
7. 以上基本实现了安装和卸载,但是最关键的是,我还需要注册DLL到GAC呢.
8. 在当前解决方案中新建项目—选择C#类库,单击确定,删除默认的Class1.cs类,在该类库中右键添加新项搜索安装程序类,取个名字,单击确定
9. 接下来就写代码实现注册DLL到GAC中了。
10. 重载2个方法:OnAfterInstall()和Uninstall(),前面这个是安装时用的,后面这个是卸载时用的。其中需要获取用户的安装目录路径,可通过this.Context.Parameters["targetdir"].ToString() 得到。这个targetdir参数 稍后会配置.
11. 直接贴代码:
///<summary>
/// 执行CMD命令
/// </summary>
/// <param name="list">命令值</param>
public void RunCmd(List<string>list)
{
//**用命令方式启动gacutil.exe
Process p = new Process();
p.StartInfo.FileName ="cmd.exe";
p.StartInfo.UseShellExecute =false;
p.StartInfo.RedirectStandardInput =true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError =true;
p.StartInfo.CreateNoWindow = true;
p.Start();
//**填写执行命令
foreach (string item in list)
{
p.StandardInput.WriteLine(item);
//**执行命令
}
p.StandardInput.WriteLine("exit");
p.StandardOutput.ReadToEnd();
}
/// <summary>
/// 注册Dll到Gac
/// </summary>
public void RegDllGac()
{
//**需加双引号
string gacutil = String.Empty;
//**先找到gacutil的文件夹
if(!Environment.Is64BitOperatingSystem)
gacutil = "cd \"C:\\Program Files\\Microsoft SDKs\\Windows\\v7.0A\\bin\\NETFX 4.0Tools\"";
else
gacutil = "cd \"C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v7.0A\\Bin\\NETFX 4.0Tools\"";
string gac = "gacutil -i \"" + this.Context.Parameters["targetdir"].ToString() +"/SAEVP.ModuleWizard.dll\"";
List<string> list = newList<string>() {
gacutil,gac
};
RunCmd(list);
}
/// <summary>
/// 卸载Gac中的Dll
/// </summary>
public void UnInstallDllGac()
{
//**需加双引号
string gacutil = String.Empty;
//**先找到gacutil的文件夹
if(!Environment.Is64BitOperatingSystem)
gacutil = "cd \"C:\\Program Files\\Microsoft SDKs\\Windows\\v7.0A\\bin\\NETFX 4.0Tools\"";
else
gacutil = "cd \"C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v7.0A\\Bin\\NETFX 4.0Tools\"";
string gac = "gacutil -u \"SAEVP.ModuleWizard, Version=1.0.0.0, Culture=neutral,PublicKeyToken=b7f931a495d236a4\"";
List<string> list = newList<string>() {
gacutil,gac
};
RunCmd(list);
}
protected override voidOnAfterInstall(IDictionary savedState)
{
if (savedState == null)
{
Console.WriteLine("IDictionary 丢失");
}
else
{
base.OnAfterInstall(savedState);
try
{
RegDllGac();
}
catch (Exception ex)
{
throw newException(ex.ToString());
}
}
}
public override voidUninstall(IDictionary savedState)
{
if (savedState == null)
{
Console.WriteLine("IDictionary 丢失");
}
else
{
base.Uninstall(savedState);
try
{
UnInstallDllGac();
}
catch (Exception ex)
{
throw newException(ex.ToString());
}
}
}
12. 其中实现的方式:就是通过调用CMD 找到Gacutil.exe的位置用gacutil.exe命令来注册DLL到GAC中,同时也通过Gacutil.exe 卸载GAC中的程序集。
13. 接下来就要在安装项目与之做关联了。
14. 在当前项目右键视图—文件系统--应用程序文件夹—右键—添加—项目输出,在弹出的框中,选择刚创建的类库,选择主输出,单击确定。
15. 在当前项目右键视图—自定义操作—安装—添加自定义操作—应用程序文件夹—主输出来自“类库的名字” (活动),单击确定。
16. 还记得前面的targetdir 参数吗,在当前项目右键视图—自定义操作—安装—主输出来自“类库的名字”(活动),右键属性窗口,属性窗口中有个 CustomActionData参数:赋值为:/targetdir="[TARGETDIR]\" 注意这个值中的双引号;不能丢失哦。否则安装过程中会报
此类错误
17. 注册成功后在哪里看呢: C:\Windows\Microsoft.NET\assembly\GAC_MSIL 这个里面 就有刚注册的DLL
18. 在卸载中照一步操作。为啥呢:卸载的时候我想把安装时注册DLL的GAC中的给卸载掉。
19. 功能差不都都实现了;但是有个前提是需要电脑中有.net framework 4.0
20.最后附上我实现的源码 : 单击下载源码
- Winform 安装包 卸载 自动注册DLL到GAC
- Dynamics CRM 注册插件dll到GAC
- C# 注册DLL 到 GAC 目录
- 将dll注册到GAC的简单图解教程
- sharepoint 使用命令行注册dll文件到gac的方法
- Windows Installer2.0 安装Assembly 到GAC中,为何卸载不掉?
- 安装包的自动安装与卸载
- 安装包的自动安装与卸载
- 用VS制作WinForm安装包及卸载包
- WiX安装选项--注册程序集到GAC和VS的设计时环境
- WiX安装选项--注册程序集到GAC和VS的设计时环境
- GAC注册
- GAC注册
- 总结: 如何将程序集(dll)安装到全局程序集缓存(GAC)中
- 如何将程序集(dll)安装到全局程序集缓存(GAC)中
- 如何将程序集(dll)安装到全局程序集缓存(GAC)中
- 如何将程序集(dll)安装到全局程序集缓存(GAC)中 收藏
- 如何将程序集(dll)安装到全局程序集缓存(GAC)中
- Android系统五大布局详解Layout
- 设计师怎样使用Xcode 5制作app原型
- ThinkPHP pdo连接Oracle的配置写法,提示报错
- HDU3342 Legal or Not 【拓扑排序】
- hdu 1203
- Winform 安装包 卸载 自动注册DLL到GAC
- android开源项目和框架
- /*恢复切换选项卡DataGridView滚动条消失办法2则,后面的切换行高速度慢*/
- innodb_force_recovery对mysql 宕机恢复影响
- Non-blocking user input in loop without ncurses
- java环境变量设置
- 免费下载高质量pdf换ppt软件
- C/C++中Static的作用详述
- innodb_flush_log_at_trx_commit AND sync_binlog (转)