gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:46:24 24 4
gpt4 key购买 nike

我一直在寻找我在程序集解析中检测到的奇怪行为的答案,但无济于事。我知道 CLR 将程序集的引用记录到它的元数据( list )中。它记录了名称、版本号、公钥 token 和语言环境。在加载程序集时,将探测并加载每个引用的程序集。此探测器是版本敏感的,或者换句话说,应该找到并加载构建中使用的相同版本,而不是任何其他版本。如果程序集已签名,公钥也会发挥作用。

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

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

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

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

LOG: Assembly Name is: dllProj, Version=1.1.10.8, Culture=neutral, 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.

最佳答案

MSDN 中,几乎在 main page about assembly binding 的末尾有一个精美的注释:

There is no version checking for assemblies without strong names, nor does the runtime check in the global assembly cache for assemblies without strong names.

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

关于c# - 即使版本号错误,依赖程序集解析也会成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26264965/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com