我有一个遵循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-->
答案 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:
答案 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);