Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何设计Wix安装程序升级以将GAC组件移动到常规文件夹中?_Wix_Windows Installer_Com Interop_Gac - Fatal编程技术网

如何设计Wix安装程序升级以将GAC组件移动到常规文件夹中?

如何设计Wix安装程序升级以将GAC组件移动到常规文件夹中?,wix,windows-installer,com-interop,gac,Wix,Windows Installer,Com Interop,Gac,我有一个现有安装,其中包括为COM互操作注册并安装在GAC中的.NET程序集。这些DLL仅由非托管EXE使用,我们也包括在安装中 一个简单的样本组件从真实的东西中模糊显示如下: <Component Id="MyApp.ClientInterop.dll" Guid="{9A9C2B62-531C-4E60-ABD2-EDD447643C4F}"> <Class Id="{963057C7-83B4-4602-87B4-B0AB9D3D149A}" Context=

我有一个现有安装,其中包括为COM互操作注册并安装在GAC中的.NET程序集。这些DLL仅由非托管EXE使用,我们也包括在安装中

一个简单的样本组件从真实的东西中模糊显示如下:

  <Component Id="MyApp.ClientInterop.dll" Guid="{9A9C2B62-531C-4E60-ABD2-EDD447643C4F}">
    <Class Id="{963057C7-83B4-4602-87B4-B0AB9D3D149A}" Context="InprocServer32" Description="MyApp.ClientInterop.ClientAppUpdate" ThreadingModel="both" ForeignServer="mscoree.dll">
      <ProgId Id="MyApp_Interop.ClientAppUpdate" Description="MyApp.ClientInterop.ClientAppUpdate" />
    </Class>
    <File Id="MyApp.ClientInterop.dll" Name="MyApp.ClientInterop.dll" KeyPath="yes" Assembly=".net">
      <TypeLib Id="{08963623-70A8-4DD8-A8DA-EAF209919797}" Description="MyApp_ClientInterop" Language="0" MajorVersion="1" MinorVersion="0">
        <Interface Id="{207BB6C4-3054-4853-BA20-40D99EA6ACFE}" Name="IClientAppUpdate" ProxyStubClassId="{00020424-0000-0000-C000-000000000046}" ProxyStubClassId32="{00020424-0000-0000-C000-000000000046}" />
      </TypeLib>
    </File>
    <RegistryValue Root="HKCR" Key="CLSID\{963057C7-83B4-4602-87B4-B0AB9D3D149A}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}" Value="" Type="string" Action="write" />
    <RegistryValue Root="HKCR" Key="CLSID\{963057C7-83B4-4602-87B4-B0AB9D3D149A}\InprocServer32\1.0.0.0" Name="Class" Value="MyApp.ClientInterop.ClientAppUpdate" Type="string" Action="write" />
    <RegistryValue Root="HKCR" Key="CLSID\{963057C7-83B4-4602-87B4-B0AB9D3D149A}\InprocServer32\1.0.0.0" Name="Assembly" Value="MyApp.ClientInterop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cf47a01d50a7b0f5" Type="string" Action="write" />
    <RegistryValue Root="HKCR" Key="CLSID\{963057C7-83B4-4602-87B4-B0AB9D3D149A}\InprocServer32\1.0.0.0" Name="RuntimeVersion" Value="v4.0.30319" Type="string" Action="write" />
    <RegistryValue Root="HKCR" Key="CLSID\{963057C7-83B4-4602-87B4-B0AB9D3D149A}\InprocServer32" Name="Class" Value="MyApp.ClientInterop.ClientAppUpdate" Type="string" Action="write" />
    <RegistryValue Root="HKCR" Key="CLSID\{963057C7-83B4-4602-87B4-B0AB9D3D149A}\InprocServer32" Name="Assembly" Value="MyApp.ClientInterop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cf47a01d50a7b0f5" Type="string" Action="write" />
    <RegistryValue Root="HKCR" Key="CLSID\{963057C7-83B4-4602-87B4-B0AB9D3D149A}\InprocServer32" Name="RuntimeVersion" Value="v4.0.30319" Type="string" Action="write" />
  </Component>
出于几个原因,我不想在这里讨论,我们希望重新设计应用程序,使DLL与可执行文件一起存在于文件夹中,而不是GAC中

这可以通过主要升级来实现,而不需要用户完全卸载以前的版本。我们的安装程序是按顺序排列的,所以旧版本在最终确定期间会被删除,因为大多数升级只会更改一小部分组件

我最初计划对每个GAC组件进行以下更改:

删除程序集=.Net属性 在组件元素上生成新Guid 这应该适用于文件系统。但是,我不确定、、和元素会发生什么情况。如果我不改变这些,我怀疑当旧版本最终卸载时,它们会被删除,留下一个坏的安装

这是准确的解释吗?这是否意味着我需要为所有互操作类强制新的Interface/Typelib/CLSID值?我在这个项目上通过互操作公开了1000多个类

我可以更改顺序以便先安装旧产品吗?我之所以关注这一点,是因为这意味着我必须遵循这一顺序,直到我能够确定我的所有客户都超出了该版本。它还将显著增加先前测试过的安装时间


也许还有另一个我不知道的选择?

在一开始使用RemoveExistingProducts进行主要升级会更安全,可以说是一个全新的选择。但我认为,如果:

程序集将获得新的组件guid,以便从GAC中删除旧的产品程序集

注册表项没有版本控制,因此它们总是被覆盖。您应该能够保持相同的WiX组件id,但无论如何您都需要添加一个代码库位置,这样就可以很容易地看到它是否都起作用了。显然,升级后,您不需要GAC中的程序集、普通文件系统中的程序集、指向它们的代码库注册表项以及可以调用它们的客户端ok:


使用版本设置的条件编写两个REP元素有意义吗?例如:如果中断版本为10.0,则变量将设置为使REP提前运行。稍后的执行将是相反的条件。如果希望将来的所有产品在开始时都使用REP升级,则可以这样做。如果找到某个特定版本或我假设的更早版本,则可以使用升级机制设置属性,然后早期的REP以该属性为条件,而后期的REP以不以该属性为条件。我想不出有什么不对。