我遇到了无法使用ClickOnce发布我的WPF应用程序的问题。
该应用程序使用Nuget包MVVM Light 4.1.26.1,Unity 2.1.505.2,CommonServiceLocator 1.0。
问题在于,当我发布时,它都构建良好,但是当我尝试安装clickonce包时出现此错误:
无法安装或运行该应用程序。该应用程序要求首先将程序集Microsoft.Practices.ServiceLocation版本1.0.0.0安装到全局程序集缓存(GAC)中。
我做了一些挖掘,发现清单中有两个对该程序集的引用,其中一个被标记为我无法摆脱的先决条件:
<dependency>
<dependentAssembly dependencyType="preRequisite" allowDelayedBinding="true">
<assemblyIdentity name="Microsoft.Practices.ServiceLocation" version="1.0.0.0" publicKeyToken="59D6D24383174AC4" language="neutral" processorArchitecture="msil" />
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly dependencyType="install" allowDelayedBinding="true" codebase="Microsoft.Practices.ServiceLocation.dll" size="29760">
<assemblyIdentity name="Microsoft.Practices.ServiceLocation" version="1.0.0.0" publicKeyToken="31BF3856AD364E35" language="neutral" processorArchitecture="msil" />
<hash>
<dsig:Transforms>
<dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
</dsig:Transforms>
<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
<dsig:DigestValue>eee+a+dQmhpSY/ApLxRipXdEp8UsTaZHXHClBU0Iwyc=</dsig:DigestValue>
</hash>
</dependentAssembly>
</dependency>
我很确定ClickOnce的问题在于对这个程序集的两个引用具有相同的版本(但请注意不同的公钥标记)。
我创建了一个非常简单的repro,如下所示:
这是一个repro项目:
我有什么想法可以解决这个问题?
答案 0 :(得分:2)
现在是2019年,我遇到了一个类似的问题,首先发现了这个问题,但是发现了另一个(较新的)问题和解决方案,以使MVVMLight和Microsoft.Practices.ServiceLocation协同工作。
Mvvmlight 5.4.1.1 与 CommonServiceLocater 2.0.4 (这都是2019年3月的最新稳定版本)不兼容,是mvvmlight引导{{1 }}
两件事奏效了:
降级为
CommonServiceLocater 1.3.0
Mvvmlight 5.3.0.0
或更改引用来源
ViewModelLocator.cs
到
using Microsoft.Practices.ServiceLocation;
答案 1 :(得分:1)
是。 MVVMLight ServiceLocation程序集使用与每个其他公共实现不同的公钥标记。它已经让我的生活成了一段时间的噩梦。我终于不得不撕掉我所有的nuget程序集,现在回到公共目录中的文件引用。我在等劳伦特来解决这个问题。
答案 2 :(得分:1)
请再试一次。我刚刚将一个新版本(4.1.27.0)推送到Nuget,这取决于可用的官方CommonServiceLocator包。这应该可以解决您的问题。如果您有更多问题,请务必告诉我。
干杯 劳伦
答案 3 :(得分:0)
尽管安装了MVVMLight nuget包的4.1.27版本,但我也遇到了这个问题。经过几个小时的挫折,我发现这是因为我安装了MVVMLight工具包(适用于Visual Studio 2012的v.4.1)。一旦我卸载它,我的部署就开始重新开始了。
我以为我会留下这个,以防其他人遇到这种特殊情况。