【问题标题】:MVVM Light assembly conflict with Microsoft.Practices.ServiceLocationMVVM Light 程序集与 Microsoft.Practices.ServiceLocation 冲突
【发布时间】:2019-03-07 07:02:07
【问题描述】:

我的 WPF 应用程序无法使用 ClickOnce 发布。

应用程序使用 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,如下所示:

  1. 创建一个新的 WPF 应用程序
  2. 添加 Nuget 包 MVVM Light
  3. 添加 Nuget 包 Unity(还添加了名为 CommonServiceLocator)
  4. 构建和发布 WPF 应用程序
  5. 尝试安装已发布的 MyApp.application clickOnce 包....得到上面详述的错误

这是一个复制项目:

skydrive repro project

有什么想法可以解决这个问题吗?

【问题讨论】:

    标签: mvvm-light


    【解决方案1】:

    现在是 2019 年,我遇到了一个类似的问题,发现这个问题是第一个条目,但发现了另一个(更新的)问题和解决方案,让 MVVMLight 和 Microsoft.Practices.ServiceLocation 一起工作。

    Mvvmlight 5.4.1.1 不适用于 CommonServiceLocater 2.0.4(这是 2019 年 3 月最新的稳定版本),mvvmlight 引导它的方式是 ViewModelLocator.cs

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

    或更改参考来源

    using Microsoft.Practices.ServiceLocation;    
    

    到

    using CommonServiceLocator;
    

    【讨论】:

      【解决方案2】:

      请再试一次。我刚刚将一个新版本(4.1.27.0)推送到 Nuget,这取决于可用的官方 CommonServiceLocator 包。这应该可以解决您的问题。如果您还有其他问题,请务必让我知道。

      干杯 洛朗

      【讨论】:

      • Bugnion 先生,您是个传奇人物,这解决了我所有的问题。感谢快速周转......干杯!
      【解决方案3】:

      是的。 MVVMLight ServiceLocation 程序集使用与其他所有公共实现不同的公钥令牌。很长一段时间以来,它使我的生活成为噩梦。我最终不得不删除我所有的 nuget 程序集并暂时返回到公共目录中的文件引用。我正在等待 Laurent 解决此问题。

      【讨论】:

      • 感谢 ecathell。有人建议尝试使用 Nuget 的 Portable.MVVMLightLibs 包。它显然对 CSL 包有 Nuget 依赖,而不是直接包含 ServiceLocation 程序集(使用不同的公钥)。我还没有尝试过,所以我不知道它是否有效......
      • 我正在努力解决 MVVM Light Nuget 包上的问题。 MVVM Light 支持的大多数框架的强名称和缺乏可用性是问题的原因。很抱歉给您带来不便,我希望这个周末能修复一下。
      【解决方案4】:

      尽管安装了 MVVMLight nuget 包的 4.1.27 版本,但我也遇到了这个问题。经过数小时的挫折后,我发现这是因为我安装了 MVVMLight 工具包(Visual Studio 2012 的 v.4.1)。卸载它后,我的部署又开始工作了。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-17
        • 1970-01-01
        • 2013-07-20
        • 2012-02-21
        • 2014-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多