FileLoadException在InitializeComponent或x:Class =

时间:2015-03-31 13:27:42

标签: c# wpf probing assemblybinding

我在InitializeComponent - 方法获得了文件加载器异常(第一次机会),或者调试器在多个WPF用户控件的xaml-root的x:Class属性处中断。尽管例外情况会使导航速度减慢很多,但一切正常。

这是异常消息:

  

无法加载文件或程序集' Company.Solution.UserInterface,Version = 0.1.5568.25577,Culture = neutral,PublicKeyToken = 45069ab0c15881ce'或其中一个依赖项。定位的程序集的清单定义与程序集引用不匹配。 (HRESULT异常:0x80131040)

这是Fusion日志:

Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
Running under executable  D:\Development\Product\Main\src\Company.Product \bin\Debug\Product.vshost.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: DisplayName = Company.Product .UserInterface, Version=0.1.5568.25577, Culture=neutral, PublicKeyToken=45069ab0c15881ce
(Fully-specified)
LOG: Appbase = file:///D:/Development/Product/Main/src/Company.Product/bin/Debug/
LOG: Initial PrivatePath = NULL
Calling assembly : PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.     
LOG: This bind starts in default load context.
LOG: Using application configuration file: D:\Development\Product \Main\src\Company.Product \bin\Debug\Product .vshost.exe.Config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Post-policy reference: Company.Product .UserInterface, Version=0.1.5568.25577, Culture=neutral, PublicKeyToken=45069ab0c15881ce
LOG: Attempting download of new URL file:///D:/Development/Product/Main/src/Company.Product/bin/Debug/Company.Product.UserInterface.DLL.
WRN: Comparing the assembly name resulted in the mismatch: Revision Number
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

我的项目结构有一个根项目,它引用一个模块项目(发生异常)。模块项目本身引用的项目是上述探测的目标" Company.Product.UserInterface.dll"其中包含一些资源/控件/样式/基元/转换器等。

如何摆脱FileLoadExceptions

另一个更完整的Fusion-log:

=== Pre-bind state information ===
LOG: DisplayName = Company.Product.UserInterface, Version=0.1.5577.18122,      Culture=neutral, PublicKeyToken=45069ab0c15881ce
(Fully-specified)
LOG: Appbase = file:///D:/Development/Product/Main/src/Company.Product/bin/Debug/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = Product.vshost.exe
Calling assembly : PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.
LOG: This bind starts in default load context.
LOG: Using application configuration file: D:\Development\Product\Main\src\Company.Product\bin\Debug\Product.vshost.exe.Config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Post-policy reference: Company.Product.UserInterface, Version=0.1.5577.18122, Culture=neutral, PublicKeyToken=45069ab0c15881ce
LOG: GAC Lookup was unsuccessful.
LOG: Attempting download of new URL file:///D:/Development/Product/Main/src/Company.Product/bin/Debug/Company.Product.UserInterface.DLL.
LOG: Assembly download was successful. Attempting setup of file: D:\Development\Product\Main\src\Company.Product\bin\Debug\Company.Product.UserInterface.dll
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: Company.Product.UserInterface, Version=0.1.5577.18123, Culture=neutral, PublicKeyToken=45069ab0c15881ce
WRN: Comparing the assembly name resulted in the mismatch: Revision Number
ERR: The assembly reference did not match the assembly definition found.
ERR: Run-from-source setup phase failed with hr = 0x80131040.
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

当异常发生时,引用的SolutionExplorer中的程序集版本为0.1.5577.18123(在引用..UserInterface.dll的所有解决方案中。我不知道谁查找0.1.5577.18122,此版本从未执行过存在)

如果我运行一个新的重建,我得到同样的错误,Fusion寻找(我从来没有这个版本号):

LOG: Post-policy reference: Company.Product.UserInterface, Version=0.1.5577.18465, Culture=neutral, PublicKeyToken=45069ab0c15881ce

找到的版本是:

LOG: Assembly Name is: Company.Product.UserInterface, Version=0.1.5577.18466, Culture=neutral, PublicKeyToken=45069ab0c15881ce

Visual Studio版本是2013 Ultimate,该项目基于.net4.5构建,组装版本在构建过程中自动生成。 我上传了构建日志to tinyupload,因为它太大了。 可以找到完整的Fusion-log here at pastebin

2 个答案:

答案 0 :(得分:7)

   Version=0.1.5577.18122

这个自动生成的版本号告诉一个故事,版本号的最后两部分不是任意的。它们基于组件构建的日期和时间。内部版本号是从2000年1月1日以来的天数生成的。修订号是自午夜以来没有夏令时修正的秒数* 2。

所以我们知道的事实是,18122集会建于3月30日下午2:12:34。然后它再次建立 ,2秒后在下午2:12:36建立。在它被用作构建另一个项目的参考组件之后,这使得CLR吐出子弹。

这应该,项目必须只在一个构建会话中构建一次。找出发生这种情况的原因需要深入研究MSBuild跟踪。您可以使用工具+选项,项目和解决方案,构建和运行生成所需的工具。将“MSBuild项目构建输出详细程度”设置更改为“详细”。 MSBuild现在非常健谈,并告诉你为什么决定建立一个项目。如果你在树林里迷路试图解码它的输出(有很多),那么将它复制/粘贴到一个粘贴盒中并在你的问题中链接到它。

对于像这样的事故,没有太多很好的解释。较旧的VS版本很容易在项目之间意外创建循环依赖。您可以使用Build + Clean刷新它。现在重建解决方案失败并告诉您哪个参考组件是麻烦制造者。但是你使用的是.NET 4,至少VS2010。所以不是一个出色的领导,微软增加了更多的检查,以防止这种情况发生,没有警告。不确定它是否在所有情况下都是可靠的,如果你不依赖于MSBuild,它可能会被愚弄。在具有“持续集成”功能的构建服务器上并不罕见。

我们需要构建跟踪来为您提供可靠的诊断。

答案 1 :(得分:1)

建议1

是否存在循环引用导致加载旧版本的dll? (事实证明这不是重点,但出于历史原因,我已经离开了)。 Relating to this answer

建议2

您可以尝试创建发布商政策吗? 以下是需要添加到app.config文件的示例。

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="Company.Solution.UserInterface"
                        publicKeyToken="45069ab0c15881ce"
                        culture="en-us" />
      <!-- Redirecting to version 0.1.5568.25577 of the assembly. -->
      <bindingRedirect oldVersion="0.0.0.0-0.1.5568.25577"
                      newVersion="0.1.5568.25577"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>

Explained in further detail here

建议3

关于用于签署程序集的密钥有什么变化吗?

建议4

略微改编我最初的建议。您已声明有3个项目引用了Company.Solution.UserInterface。您能否确认所有3个项目都引用了该程序集的相同版本?