签署应用程序时出现System.IO.FileLoadException

时间:2016-03-14 18:45:23

标签: c# wpf mvvm

我有一个遵循MVVM模式的WPF应用程序。我们最近签署了应用程序,现在我在启动时获得了很多第一次机会异常。我已将问题追溯到以下内容:

在任何视图中,如果我在初始化视图时在应用程序中引用另一个命名空间,我会收到错误:

angular.module('blocks.auth').controller('myController', function ($scope, api) {  
  
  $scope.activate() {
    vm.user = profile.user;
  }

  $scope.login (user, pass) {
    api.login(user, pass)
        .then(function(response){
            profile.user = response.data;
            vm.user = profile.
        });
  }
  
  $scope.activate();
  
})

它一直在寻找一个比我实际运行的版本落后1的版本。

如果我从视图中删除对其他命名空间的引用,"Could not load file or assembly 'MyApplication, Version=3.0.5917.24348, Culture=neutral, PublicKeyToken=xxxxxxxxxxxx' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)":"MyApplication, Version=3.0.5917.24348, Culture=neutral, PublicKeyToken=xxxxxxxxxxx" 不会抛出错误

查看:

InitializeComponent()

如果我删除这些引用,并将我的转换器和行为移动到另一个DLL,然后通过DLL引用它们没有问题。错误消失了。此外,如果我没有签署该应用程序,我不会得到错误。我真的不想在不同的DLL中引用这些东西,看起来这应该工作正常。当所有视图都被创建时,它也会花费大约30秒来抛出所有这些错误,因此我对性能产生了重大影响。我不知道为什么应用程序试图加载自己,以及为什么它试图加载自己的旧版本。无论我构建多少次,错误始终都是1版本。

Fusion Log:

<UserControl x:Class="MyApplication.View.DiagnosticsView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:convert="clr-namespace:MyApplication.Converters"  <!--Causes error-->
             xmlns:behave="clr-namespace:MyApplication.Behaviors" <!--Causes error-->
             xmlns:controls="clr-namespace:MyApplication.UserControls"  <!--Causes error-->

2 个答案:

答案 0 :(得分:1)

修改

您是否使用ProcessMonitor查看Visual Studio正在加载v 3.0.5917。 24348 的位置? Visual Studio需要v3.0.5920。 15596 ,因此您必须将该DLL放在预期的位置。

编辑2:

  

你能在这样的配置文件中加入绑定重定向吗?

<dependentAssembly>
 <assemblyIdentity name="xxxxxx" publicKeyToken="121fae78165ba3d4"/>
 <bindingRedirect oldVersion="3.0.5920.15596" newVersion="3.0.5917.24348"/>
</dependentAssembly>

参考:.Net picking wrong referenced assembly version

<强>原始

您可能会收到错误的一个原因:

  

无法加载文件或程序集“MyApplication,Version = 3.0.5917.24348,Culture = neutral,PublicKeyToken = xxxxxxxxxxxx”或其中一个依赖项。定位的程序集的清单定义与程序集引用不匹配。

当你的程序集被签名并且你对它的引用将Specific Version属性设置为True时,会导致FileLoadException。

检查您是否将特定版本设置为False:

enter image description here

答案 1 :(得分:0)

您是否可能尝试使用strong-named URI references in your XAML?例如,通过设置AssemblyPublicKeyToken attribute your project file或修改为XAML生成的代码隐藏?

如果您的XAML引用使用强名称​​和,则使用不断变化的版本,那么您的XAML最终可能会使用以前版本的项目,因为引用是生成的先前到正在完成的构建(以及正在设置的新版本)。

要检查,请在obj目录下找到为您的XAML生成的内容并检查Uris(例如~\obj\Debug\TestControl.g.i.cs):

System.Uri resourceLocater = new System.Uri("/T_Signing;V1.0.0.0;76005ee8ffcf5f2d;component/testcontrol.xaml", System.UriKind.Relative);

URI上方有全名和版本。如果你没有强大的命名参考,那么uri就更像是:

System.Uri resourceLocater = new System.Uri("/T_Signing;component/testcontrol.xaml", System.UriKind.Relative);