我们最近升级了DevExpress。因为我们有一个自定义主题,所以我们也必须升级自定义主题。
这是最简单的部分。现在,我正在尝试升级设置,以匹配新的文件。所以,基本上,我改变了一个<Component .../>的<Component .../>
来自
<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>到
<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 )中引用了这个库,但是没有其他引用。
知道会有什么问题吗?
下面是这个文件的完整组件列表:
<?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>发布于 2018-03-06 23:40:05
查看您的源文件,您的组件引用(直接计算)有几个问题。永远不要用一个组件安装多个二进制文件--这是对组件规则的直接违反。这将导致错误消息所指示的问题的类型。
我建议每个组件使用一个文件,因为这解决了大量可能的引用计数问题和升级问题。我认为,共享dll引用计数器也会导致一些忧郁。您有要与之兼容的遗留安装程序吗?如果没有,那么就没有理由启用这个组件选项--它增加了旧的、非MSI安装程序技术使用的遗留SharedDLL参考计数器。
现在,针对在现有组件中更改文件名的问题。这也违反了组件规则。您不能更改组件的键路径的绝对文件名并保持相同的组件GUID --这会破坏组件引用。绝对安装路径与组件GUID之间必须有1到1的对应关系.
如果文件移动,组件GUID就不会跟随它,当您更改其文件名(其绝对安装路径已更改)时,该文件将“移动”。这里有一个例子来解释:在wix中更改我的组件GUID? (推荐读取-解码这种MSI的特性,接下来的事情会更加清晰)。
如果您更改了文件名,您可以:
尽管如此,正如上面所解释的那样,这个来源还有更大的问题。为了将来的可靠性,您必须将这些组件拆分为每个组件的一个文件。这会在旧版本和新版本之间造成干扰,为了清除这些问题,您可以:
Schedule="afterInstallValidate"即可。这应该有效(没有时间测试)。应该是这样的--如果我正确理解了你的情况。
提议的新版本的示例WiX摘录:
<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部署解决方案中常见的设计缺陷?也许可以帮助避免一些非常常见的问题。
发布于 2018-03-07 05:59:00
我终于发现了这个问题:
DevExpress bin目录似乎打包了System.Windows.Interactivity.dll库。所以,在我们没有复制它之前,我们没有把它放在我们的Lib\DevExpress文件夹中。
我们似乎生成了一个包含在Lib\DevExpress文件夹中的所有Dll的组件,因此System.WIndows.Interactivity.dll包含在两个不同的包中。
我从DevExpress文件夹中删除了它,现在一切正常。抱歉打扰你了。
https://stackoverflow.com/questions/49124908
复制相似问题