即使版本号错误,依赖程序集解析也会成功

时间:2014-10-08 19:34:18

标签: c# .net clr .net-assembly assemblyresolve

我一直在寻找我在装配解决方案中检测到的奇怪行为的答案,但无济于事。我知道CLR会将程序集的引用记录到其元数据(清单)中。它记录名称,版本号,公钥令牌和区域设置。在组件加载时,探测并加载每个参考组件。此探针对版本敏感,或者换句话说,构建中使用的版本应该被定位和加载,而不是任何其他版本。如果程序集已签名,则公钥也会起作用。

问题是在我为测试创建的虚拟应用程序中,此规则被破坏了!我已经搜索了SO和谷歌,答案是不合适的。请不要给我以下原因,解决方法:

  • "具体版本"设置为False:仅在编译时才有效,并且与运行时没有任何关系。
  • 此外,没有设置应用程序/机器配置。

在我的测试设置中,我有项目A引用项目B.在版本化之后我改变项目B并且只构建自己而不是A.现在我将带有更改版本的新B.DLL复制到A工作中目录并运行A.它的工作原理!!我希望它会崩溃。

Fuselogvw.exe的输出应该是自我解释的。在日志中提到程序集应该查找版本9但是版本8已找到并加载!注意这一行:

  

日志:程序集名称为:dllProj,Version = 1.1.10.8,Culture = neutral,   公钥=空

*** Assembly Binder Log Entry  (10/8/2014 @ 2:34:51 PM) ***

The operation was successful.
Bind result: hr = 0x0. The operation completed successfully.

Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework64\v2.0.50727\mscorwks.dll
Running under executable  C:\...\Documents\Visual Studio 2013\Projects\test1\test1\bin\Release\test1.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: User = ...
LOG: DisplayName = dllProj, Version=1.1.10.9, Culture=neutral, PublicKeyToken=null
 (Fully-specified)
LOG: Appbase = file:///C:/.../Documents/Visual Studio 2013/Projects/test1/test1/bin/Release/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = NULL
Calling assembly : test1, Version=1.1.1.1, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\...\Documents\Visual Studio 2013\Projects\test1\test1\bin\Release\test1.exe.Config
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v2.0.50727\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file:///C:/.../Documents/Visual Studio 2013/Projects/test1/test1/bin/Release/dllProj.DLL.
LOG: Assembly download was successful. Attempting setup of file: C:\...\Documents\Visual Studio 2013\Projects\test1\test1\bin\Release\dllProj.dll
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: dllProj, Version=1.1.10.8, Culture=neutral, PublicKeyToken=null
LOG: Binding succeeds. Returns assembly from C:\...\Documents\Visual Studio 2013\Projects\test1\test1\bin\Release\dllProj.dll.
LOG: Assembly is loaded in default load context.

1 个答案:

答案 0 :(得分:1)

MSDN中,几乎在main page about assembly binding的末尾有一个细则:

  

没有强名称的程序集没有版本检查   运行时是否检查程序集的全局程序集缓存   没有强烈的名字。

有许多事情会影响程序集绑定,但在您的这个特定示例中,此行为的定义是B程序集未使用强名称引用。