MVVM Light程序集与Microsoft.Practices.ServiceLocation冲突



我遇到了一个问题,我的WPF应用程序无法使用ClickOnce发布。

该应用程序使用Nuget软件包MVVM Light 4.1.6.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的问题是因为有两个对该程序集的引用具有相同的版本(但请注意不同的公钥标记)。

我创建了一个非常简单的repo如下:

  1. 创建新的WPF应用程序
  2. 添加Nuget包MVVM Light
  3. 添加Nuget软件包Unity(也添加了名为CommonServiceLocator)
  4. 构建并发布WPF应用程序
  5. 尝试安装已发布的MyApp.application clickOnce软件包。。。。获取上面详细的错误

这是一个重建项目:

skydrive repro项目

有什么想法可以让我克服吗?

现在是2019年,我遇到了一个类似的问题,发现这个问题是第一个条目,但发现了另一个(最近的)问题和解决方案,以使MVVMLight和Microsoft.Practices.ServiceLocation协同工作。

Mvvmlight 5.4.1.1CommonServiceLocater 2.0.4(这两个版本都是2019年3月的最新稳定版本)不兼容,就像Mvvmlight引导它成为ViewModelLocator.cs 一样

有两件事奏效了:
降级到
CommonServiceLocater 1.3.0
Mvvmlight 5.3.0.0

或更改的参考

using Microsoft.Practices.ServiceLocation;    

using CommonServiceLocator;

请重试。我刚刚向Nuget推送了一个新版本(4.1.27.0),它取决于可用的官方CommonServiceLocator包。这应该可以解决您的问题。如果你有更多的问题,请一定告诉我。

干杯Laurent

是。MVVMLight ServiceLocation程序集使用的公钥令牌与其他所有公共实现不同。很长一段时间以来,它让我的生活变成了噩梦。现在,我终于不得不剥离所有的nuget程序集,回到公共目录中的文件引用。我在等劳伦特来解决这个问题。

尽管安装了MVVMLight nuget包的4.1.27版本,但我也遇到了这个问题。经过几个小时的沮丧,我发现这是因为我安装了MVVMLight工具包(Visual Studio 2012的4.1版)。一旦我卸载了它,我的部署就重新开始工作了。

我只是想把这个留在这里,以防其他人遇到这种特殊的情况。