Visual studio 2015 将文件安装到现有程序';s安装路径与Visual Studio安装项目

Visual studio 2015 将文件安装到现有程序';s安装路径与Visual Studio安装项目,visual-studio-2015,visual-studio-setup-proje,Visual Studio 2015,Visual Studio Setup Proje,我正在制作一个VisualStudio安装项目,为目标机器上的现有程序安装一个插件。我的文件需要进入该应用程序的安装目录。我希望能够干净地安装和卸载我的插件,而不会对应用程序本身造成太大的影响 现有程序的安装路径可以在注册表项中找到,并且在各个安装之间可能有所不同 我可以将Visual Studio安装项目配置为从该注册表项读取值,然后将插件文件放入注册表指定的目录(或其子目录)中吗?我是否需要使用自定义操作,或者是否可以使用标准设置项目功能来实现 我注意到,在“启动条件”窗口中,我可以设置注册

我正在制作一个VisualStudio安装项目,为目标机器上的现有程序安装一个插件。我的文件需要进入该应用程序的安装目录。我希望能够干净地安装和卸载我的插件,而不会对应用程序本身造成太大的影响

现有程序的安装路径可以在注册表项中找到,并且在各个安装之间可能有所不同

我可以将Visual Studio安装项目配置为从该注册表项读取值,然后将插件文件放入注册表指定的目录(或其子目录)中吗?我是否需要使用自定义操作,或者是否可以使用标准设置项目功能来实现

我注意到,在“启动条件”窗口中,我可以设置注册表搜索启动条件,该条件基于特定注册表项设置安装程序属性。我可以用它来检索密钥的实际值,以便在“文件”窗口中使用,还是仅为启动条件设置真/假值?

啊,毕竟在中找到了答案。这是可能的,没有自定义操作

总结:

  • 在启动条件窗口的“搜索目标机器”节点下,添加注册表搜索操作。配置“RegKey”和“Value”属性,以指定包含插件需要安装到的安装路径的注册表项值的名称。将注册表搜索操作的“Property”属性设置为合理的名称,例如“ProductInstallPath”
  • (可选)在启动条件节点下,添加启动条件并将其条件属性设置为[ProductInstallPath]。我认为这将检查注册表项值是否存在,并且在安装程序运行时是否为非空
  • 在安装项目的“文件系统”窗口中,右键单击“目标计算机上的文件系统”,然后选择“添加特殊文件夹”、“自定义文件夹”
  • 将新文件夹的默认位置属性设置为[ProductInstallPath]
  • 编辑:叹气。这在x64上不起作用,因为VisualStudio安装项目中存在一个bug,至少从VS2008起就一直存在,并且在VS2015中仍然存在。即使安装项目平台设置为x64,注册表搜索操作始终搜索x86注册表配置单元,并且看不到x64 HKLM\软件键值

    详细信息:生成的MSI文件中的RegLocator表包含注册表搜索的数据。类型字段包含使搜索成为64位本机注册表的MSIDbLocatorType64位值。添加此值以更正问题。手动(使用Orca)是测试功能的快速方法

    我的最终解决方案是使用WiX创建一个基本安装程序,并完全放弃VisualStudio安装项目

    然而,在完全切换到WiX之前,我创建了一个小型的C#控制台应用程序,可以作为构建后事件调用,以编辑visualstudio安装项目生成的MSI文件。控制台应用程序是基于部署工具基金会(DTF)的。DTF提供了一个用于编辑MSI文件的C#API。这里是它的主要部分,它可能对未来的用户有用

    使用系统;
    使用System.IO;
    使用Microsoft.Deployment.WindowsInstaller;
    /// 
    ///此程序修补Visual Studio安装项目生成的MSI文件中的注册表搜索键操作,
    ///更正Visual Studio安装项目中的x64兼容性错误。
    /// 
    /// 
    ///这两个错误是:
    ///1)Visual Studio安装项目包含32位版本的InstallUtilLib.dll,无法加载x64程序集进行反射
    ///看https://blogs.msdn.microsoft.com/heaths/2006/02/01/64-bit-managed-custom-actions-with-visual-studio/
    ///2)注册表搜索操作不设置x64位,因此只搜索32位注册表
    ///看https://social.msdn.microsoft.com/Forums/windows/en-US/40a2c1ee-7dd4-4289-a7d2-30b97239ae25/vs2005-setup-project-launch-conditions-registry-problem-on-x64-operating-systems
    /// 
    类设置修补程序
    {
    静态void Main(字符串[]参数)
    {
    如果(args.Length!=1)
    {
    WriteLine(“错误:调用此exe时将MSI文件的名称指定为第一个参数”);
    环境。出口(1);
    }
    字符串msiName=args[0];
    使用(var db=new数据库(msname,DatabaseOpenMode.Direct))
    {
    PatchInstallUtilLib(db);
    PatchRegLocator(db);
    }
    }
    /// 
    ///将32位InstallUtilLib.dll替换为x64版本
    /// 
    /// 
    专用静态void PatchInstallUtilLib(数据库数据库数据库)
    {
    使用(View View=db.OpenView(@“UPDATE`Binary`SET`Data`=?WHERE`Name`='InstallUtil'))
    {
    使用(记录rec=新记录(1))
    {
    String path=path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows),
    @“Microsoft.NET\Framework64\v4.0.30319\InstallUtilLib.dll”);
    记录设置流(1,路径);
    查看。执行(rec);
    db.Commit();
    }
    }
    }
    专用静态无效PatchRegLocator(数据库数据库数据库)
    {
    //MSI SQL语法记录如下:https://msdn.microsoft.com/en-us/library/windows/desktop/aa372021.aspx
    //在中给出的RegLocator表的架构https://msdn.microsoft.com/EN-US/library/aa371171.aspx
    //在HKLM注册表根目录中查找原始类型的注册搜索操作
    字符串注册表项=@“软件\VendorName\ProductName”;
    使用(视图)=
    db.OpenView(
    @“更新`RegLocator`SET`Type`=?其中`Type`={0}和`Root`={1}以及`Key`='{2}'”,
    (Int32)LocatorTypes.RawValue,(Int32)RegistryRoot.LocalMachine,registryKey)
    {
    使用(记录rec=新记录(1))
    {