3

我一直在寻找我在汇编决议中检测到的奇怪行为的答案,但无济于事。我知道 CLR 将程序集的引用记录到其元数据(清单)中。它记录名称、版本号、公钥令牌和语言环境。在加载程序集时,每个引用的程序集都会被探测和加载。这个探针是版本敏感的,或者换句话说,应该定位和加载构建中使用的相同版本,而不是任何其他版本。如果程序集被签名,公钥也会发挥作用。

问题是在我为测试创建的虚拟应用程序中,这条规则被打破了!我已经搜索过 SO 和 google 并且答案不正确。请不要给我以下原因,解决方法:

  • “特定版本”设置为 False:这仅在编译时为 true,与运行时无关。
  • 此外,没有应用程序/机器配置集。

在我的测试设置中,我有项目 A 引用项目 B。在对每个项目 B 进行版本控制后,我只构建自己而不是 A。现在我将具有更改版本的新 B.DLL 复制到 A 的工作目录并运行 A。它可以工作!!我预计它会崩溃。

Fuselogvw.exe 的输出应该是不言自明的。在日志中提到程序集应该寻找版本 9,但版本 8 已定位并加载!注意这一行:

日志:程序集名称为:dllProj,版本=1.1.10.8,文化=中性,PublicKeyToken=null

*** 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.
4

1 回答 1

2

在 中,几乎在主页MSDN的末尾有一个关于程序集绑定的精美注释:

没有强名称的程序集没有版本检查,运行时也不会在全局程序集缓存中检查没有强名称的程序集。

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

于 2015-03-08T02:05:02.360 回答