首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >目标文件“XXXX”由LFN系统上的两个不同组件安装在“YYYY”中

目标文件“XXXX”由LFN系统上的两个不同组件安装在“YYYY”中
EN

Stack Overflow用户
提问于 2018-03-06 06:48:44
回答 2查看 1.2K关注 0票数 0

我们最近升级了DevExpress。因为我们有一个自定义主题,所以我们也必须升级自定义主题。

这是最简单的部分。现在,我正在尝试升级设置,以匹配新的文件。所以,基本上,我改变了一个<Component .../><Component .../>

来自

代码语言:javascript
运行
复制
  <Component Id="Lib_Various_Files" Guid="9C621EB0-12E6-4D1D-8B5B-4150A76E33AA" KeyPath="yes" SharedDllRefCount="yes">
    ...
    <File Id="DevExpress.Xpf.Themes.PreviousTheme.v17.1.dll" Name="DevExpress.Xpf.Themes.PreviousTheme.v17.1.dll" ReadOnly="yes" Vital="no" Compressed="default" DiskId="1" Source="$(var.DirLib)\PreviousTheme\DevExpress.Xpf.Themes.PreviousTheme.v17.1.dll" />
  </Component>

代码语言:javascript
运行
复制
  <Component Id="Lib_Various_Files" Guid="9C621EB0-12E6-4D1D-8B5B-4150A76E33AA" KeyPath="yes" SharedDllRefCount="yes">
    ...
    <File Id="DevExpress.Xpf.Themes.OurTheme.v17.2.dll" Name="DevExpress.Xpf.Themes.OurTheme.v17.2.dll" ReadOnly="yes" Vital="no" Compressed="default" DiskId="1" Source="$(var.DirLib)\OurTheme\.td\Publish\DevExpress.Xpf.Themes.OurTheme.v17.2.dll" />
  </Component>

现在我在设置中出现了一个错误,它似乎没有链接到这一行:

error LGHT0204: ICE30:目标文件ICE30由LFN系统上的两个不同组件安装在'TARGETDIR\OurProduct\Bin\‘中:'cmpF5730C92213BA3272DDA3A5657DFF782’和'Lib_Prism‘。这会破坏组件引用计数。D:\ws\OurProduct-Nightly\SetupWix\SetupWix\SetupWix.wixproj

我们在Lib_Prism组件(然后在另一个Lib_Various组件中引用Lib_Prism Lib_Various_Files )中引用了这个库,但是没有其他引用。

知道会有什么问题吗?

下面是这个文件的完整组件列表:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Fragment>
    <?include ..\Common.wxi?>

    <DirectoryRef Id="BIN">
      <Component Id="Lib_Various_Files" Guid="9C621EB0-12E6-4D1D-8B5B-4150A76E33AA" KeyPath="yes" SharedDllRefCount="yes">
        ...
        <File Id="DevExpress.Xpf.Themes.OurTheme.v17.2.dll" Name="DevExpress.Xpf.Themes.OurTheme.v17.2.dll" ReadOnly="yes" Vital="no" Compressed="default" DiskId="1" Source="$(var.DirLib)\OurTheme\.td\Publish\DevExpress.Xpf.Themes.OurTheme.v17.2.dll" />
      </Component>
      <Component Id="Lib_MicrosoftPractices" Guid="780097FD-40C9-417A-A2C3-7C2B44567BEC" KeyPath="yes" SharedDllRefCount="yes">
        <File ReadOnly="yes" DiskId="1" Source="$(var.DirPackages)\CommonServiceLocator.1.3\lib\portable-net4+sl5+netcore45+wpa81+wp8\Microsoft.Practices.ServiceLocation.dll" />
        <File ReadOnly="yes" DiskId="1" Source="$(var.DirPackages)\Unity.4.0.1\lib\net45\Microsoft.Practices.Unity.Configuration.dll" />
        <File ReadOnly="yes" DiskId="1" Source="$(var.DirPackages)\Unity.4.0.1\lib\net45\Microsoft.Practices.Unity.RegistrationByConvention.dll" />
        <File ReadOnly="yes" DiskId="1" Source="$(var.DirPackages)\Unity.4.0.1\lib\net45\Microsoft.Practices.Unity.dll" />
      </Component>
      <Component Id="Lib_Prism" Guid="0F937515-2248-4CD2-B2E9-3E121FA9D743" KeyPath="yes" SharedDllRefCount="yes">
        <File ReadOnly="yes" DiskId="1" Source="$(var.DirPackages)\Prism.Core.6.3.0\lib\net45\Prism.dll" />
        <File ReadOnly="yes" DiskId="1" Source="$(var.DirPackages)\Prism.Unity.6.3.0\lib\net45\Prism.Unity.Wpf.dll" />
        <File ReadOnly="yes" DiskId="1" Source="$(var.DirPackages)\Prism.Wpf.6.3.0\lib\net45\Prism.Wpf.dll" />
        <File ReadOnly="yes" DiskId="1" Source="$(var.DirPackages)\Prism.Wpf.6.3.0\lib\net45\System.Windows.Interactivity.dll" />
      </Component>
      <Component Id="Lib_MvvmValidation" Guid="8681DBA1-F83D-475B-BCB8-A54A1F05FF0A" KeyPath="yes" SharedDllRefCount="yes">
        <File ReadOnly="yes" DiskId="1" Source="$(var.DirPackages)\MvvmValidation.3.1.0\lib\netstandard1.0\MvvmValidation.dll" />
      </Component>
      <Component Id="Lib_Protobuf_Net" Guid="AEE6F4EB-78E3-4EC5-AA88-D5CC29D683D0" KeyPath="yes" SharedDllRefCount="yes">
        <File ReadOnly="yes" DiskId="1" Source="$(var.DirDotfuscated)\ProtobufNet.dll" />
      </Component>
    </DirectoryRef>

    <ComponentGroup Id="Lib_Various" >
      <ComponentRef Id="Lib_MicrosoftPractices" />
      <ComponentRef Id="Lib_Prism" />
      <ComponentRef Id="Lib_Various_Files" />
      <ComponentRef Id="Lib_MvvmValidation" />
      <ComponentRef Id="Lib_Protobuf_Net" />
    </ComponentGroup>

  </Fragment>
</Wix>
EN

回答 2

Stack Overflow用户

发布于 2018-03-06 23:40:05

查看您的源文件,您的组件引用(直接计算)有几个问题。永远不要用一个组件安装多个二进制文件--这是对组件规则的直接违反。这将导致错误消息所指示的问题的类型。

我建议每个组件使用一个文件,因为这解决了大量可能的引用计数问题和升级问题。我认为,共享dll引用计数器也会导致一些忧郁。您有要与之兼容的遗留安装程序吗?如果没有,那么就没有理由启用这个组件选项--它增加了旧的、非MSI安装程序技术使用的遗留SharedDLL参考计数器。

现在,针对在现有组件中更改文件名的问题。这也违反了组件规则。您不能更改组件的键路径的绝对文件名并保持相同的组件GUID --这会破坏组件引用。绝对安装路径与组件GUID之间必须有1到1的对应关系.

如果文件移动,组件GUID就不会跟随它,当您更改其文件名(其绝对安装路径已更改)时,该文件将“移动”。这里有一个例子来解释:在wix中更改我的组件GUID? (推荐读取-解码这种MSI的特性,接下来的事情会更加清晰)。

如果您更改了文件名,您可以:

  1. 通过删除源中的GUID部分,将组件GUID设置为自动生成GUID。然后生成GUID,使其稳定,只要安装目标路径保持不变,并且当您更改文件名时(例如,WiX将自动为您自动生成一个新GUID )。见这个示例的答案:WIX中guids的语法?
  2. 为您更改正在安装的文件名的组件设置一个新的、硬编码的GUID。这是很容易忘记-因此,建议自动魔术在第1点描述。
  3. 当文件名更改时,您实际上应该做的是删除旧组件,并添加一个新的文件名为的。但是,更改现有组件的GUID和更改文件名具有相同的效果(与删除旧组件和添加新组件相同)。

尽管如此,正如上面所解释的那样,这个来源还有更大的问题。为了将来的可靠性,您必须将这些组件拆分为每个组件的一个文件。这会在旧版本和新版本之间造成干扰,为了清除这些问题,您可以:

  1. 为您的项目设置了一个全新的安装路径,并从现在起每个文件使用一个组件,您可以使用WiX的自动魔术组件生成特性,如前所述。这会管用的。设置一个新的主安装文件夹“破坏链接”到“过去的组件引用sins”。
  2. 或者,您可以在您的主要升级期间,通过在最新MSI版本的早期在InstallExecuteSequence中移动RemoveExistingProducts来卸载现有的安装。这也会清除任何引用问题的组件,并且您可以将源更改为每个组件继续使用一个文件。如果使用MajorUpgrade元素,则此更改非常简单--只需设置Schedule="afterInstallValidate"即可。这应该有效(没有时间测试)。

应该是这样的--如果我正确理解了你的情况。

提议的新版本的示例WiX摘录:

代码语言:javascript
运行
复制
<DirectoryRef Id="BIN">
  <Component Feature="Product"> 
    <File Source="$(var.DirLib)\OurTheme\.td\Publish\DevExpress.Xpf.Themes.OurTheme.v17.2.dll" />
  </Component>      
  <Component Feature="Product"> 
    <File Source="$(var.DirPackages)\CommonServiceLocator.1.3\lib\portable-net4+sl5+netcore45+wpa81+wp8\Microsoft.Practices.ServiceLocation.dll" />
  </Component>      
  <Component Feature="Product"> 
    <File Source="$(var.DirPackages)\Unity.4.0.1\lib\net45\Microsoft.Practices.Unity.Configuration.dll" />
  </Component>
  <Component Feature="Product"> 
    <File Source="$(var.DirPackages)\Unity.4.0.1\lib\net45\Microsoft.Practices.Unity.RegistrationByConvention.dll" />
  </Component>
  <...>
</DirectoryRef>

注意可以自动生成的所有属性的经过简化的源代码,以及现在包含一个文件的所有组件。还可以直接说明每个组件属于什么特性,作为组件元素的属性。我发现这会产生最不复杂和最灵活的WiX源文件。偏好是不同的--很明显。

我不会使用当前的“每个组件多个二进制文件”设置。如果你这么做的话,会有更多的麻烦--几乎可以保证。MSI咬牙切齿-抱歉地说-有很多熊陷阱。MSI有接近反模式的方面。几乎每个人都面临着这些问题。下面有一节介绍了潜在的反模式,以及MSI为企业部署带来的巨大好处(仅供参考):如何更好地利用MSI文件

我并不特别热衷于这种常见的MSI问题的混乱编写,但这里是这样的:如何避免WiX / MSI部署解决方案中常见的设计缺陷?也许可以帮助避免一些非常常见的问题。

票数 1
EN

Stack Overflow用户

发布于 2018-03-07 05:59:00

我终于发现了这个问题:

DevExpress bin目录似乎打包了System.Windows.Interactivity.dll库。所以,在我们没有复制它之前,我们没有把它放在我们的Lib\DevExpress文件夹中。

我们似乎生成了一个包含在Lib\DevExpress文件夹中的所有Dll的组件,因此System.WIndows.Interactivity.dll包含在两个不同的包中。

我从DevExpress文件夹中删除了它,现在一切正常。抱歉打扰你了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49124908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档