2012-08-05 36 views
13

我正在开发一个windows c#控制台应用程序,我希望用户可以将它安装到他们的计算机上。编程注册程序到添加/删除程序并将文件存储在可执行文件中

我想制作自己的Windows Installer可执行文件,因为Visual Studio中内置的安装部署工具似乎缺少用于定制和文档的功能。

因此,因为我想制作我自己的Windows安装程序,我如何将程序注册到“添加/删除程序”窗口中,以便他们可以选择再次卸载它,并且它会重新启动安装程序以执行删除。

此外,可执行文件显然需要将文件复制到PC上的各个位置,即C:\Program Files因此,如何将可执行文件存储在Windows安装程序可执行文件中,以便将它们移动到正确的位置。

这是可能的吗?

感谢您提供的任何帮助。

+0

您是否尝试过ClickOnce部署选项? – 2012-08-05 20:35:15

+0

为什么要重新发明轮子?如果你不喜欢附带的Windows工具,我会直接去NSIS:http://nsis.sourceforge.net/Main_Page。 – Mark 2012-08-05 20:37:02

+0

如何使用WiX? – siride 2016-12-29 03:04:24

回答

23

下面是我们使用添加到我们的注册程序的常规/删除程序:

private void CreateUninstaller() 
{ 
    using (RegistryKey parent = Registry.LocalMachine.OpenSubKey(
       @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", true)) 
    { 
     if (parent == null) 
     { 
      throw new Exception("Uninstall registry key not found."); 
     } 
     try 
     { 
      RegistryKey key = null; 

      try 
      { 
       string guidText = UninstallGuid.ToString("B"); 
       key = parent.OpenSubKey(guidText, true) ?? 
         parent.CreateSubKey(guidText); 

       if (key == null) 
       { 
        throw new Exception(String.Format("Unable to create uninstaller '{0}\\{1}'", UninstallRegKeyPath, guidText)); 
       } 

       Assembly asm = GetType().Assembly; 
       Version v = asm.GetName().Version; 
       string exe = "\"" + asm.CodeBase.Substring(8).Replace("/", "\\\\") + "\""; 

       key.SetValue("DisplayName", "My Program"); 
       key.SetValue("ApplicationVersion", v.ToString()); 
       key.SetValue("Publisher", "My Company"); 
       key.SetValue("DisplayIcon", exe); 
       key.SetValue("DisplayVersion", v.ToString(2)); 
       key.SetValue("URLInfoAbout", "http://www.blinemedical.com"); 
       key.SetValue("Contact", "[email protected]"); 
       key.SetValue("InstallDate", DateTime.Now.ToString("yyyyMMdd")); 
       key.SetValue("UninstallString", exe + " /uninstallprompt"); 
      } 
      finally 
      { 
       if (key != null) 
       { 
        key.Close(); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      throw new Exception(
       "An error occurred writing uninstall information to the registry. The service is fully installed but can only be uninstalled manually through the command line.", 
       ex); 
     } 
    } 
} 
+0

什么是“B”? – MacGyver 2015-12-20 18:26:56

+1

@MacGyver,'B'表示“32个位数用连字符分隔,括在括号”,这是注册表用来GUID的格式。 https://msdn.microsoft.com/en-us/library/97af8hh4(v=vs.110).aspx – 2015-12-20 18:41:35

+2

因此,它看起来像“UninstallGuid”和“UninstallRegKeyPath”是在源代码中定义。我假设第二个是exe的卸载应用程序的路径。你能评论这两个吗?我也可以发布一个问题来取消这个注册码,但这是我的第三个也是最后一个问题。 – MacGyver 2015-12-20 18:45:32

2

请勿建立您自己的安装程序,请使用经过验证的部署工具,如: NSIS,Inno SetupWiX。所有这些都是免费的,并有很多功能。

+4

不要忘记,他们有自己的喜欢的学习曲线,还有另一种编程语言,更多的文件来处理,位(没有AnyCPU),本地化 – Firo 2012-11-08 13:45:25

+0

我不会忘记。但请相信那些构建这些相当复杂的系统的人,他们解决了许多问题,即使它可以帮助您学习一种新语言,但您自己也没有时间去做。 作为一个方面说明:没有位或本地化的问题,你不会结束更多的文件处理。 – Eden 2013-01-10 13:54:12

+0

也增加了bitrock。我用过一次。它很容易使用。但不是开源的。 – prabhakaran 2014-05-08 08:38:26

0

我会建议在这种情况下使用MSI安装程序,因为它可以让你有包裹详情(姓名),其中将文件复制客户端的控制和允许添加您要包含一部分额外的文件msi安装程序。

0

为了上帝的爱不使用的ClickOnce ......它更是一个麻烦比它的价值的。如果您没有机器的管理权限并需要安装某些东西,那么值得花时间征求权限。

相关问题