Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 即使版本号错误,从属程序集解析也会成功_C#_.net_Clr_.net Assembly_Assemblyresolve - Fatal编程技术网

C# 即使版本号错误,从属程序集解析也会成功

C# 即使版本号错误,从属程序集解析也会成功,c#,.net,clr,.net-assembly,assemblyresolve,C#,.net,Clr,.net Assembly,Assemblyresolve,我一直在寻找我在汇编解析中检测到的奇怪行为的答案,但毫无用处。我知道CLR将程序集的引用记录到其元数据(清单)中。它记录名称、版本号、公钥令牌和区域设置。加载程序集后,将探测并加载每个引用的程序集。此探测是版本敏感的,或者换句话说,应该定位并加载与生成中使用的版本相同的版本,而不是任何其他版本。如果对程序集进行签名,公钥也将起作用 问题是,在我为测试而创建的虚拟应用程序中,这个规则被打破了!我已经搜索了SO和google,答案都是错误的。请不要告诉我以下原因、解决方法: “Specific V

我一直在寻找我在汇编解析中检测到的奇怪行为的答案,但毫无用处。我知道CLR将程序集的引用记录到其元数据(清单)中。它记录名称、版本号、公钥令牌和区域设置。加载程序集后,将探测并加载每个引用的程序集。此探测是版本敏感的,或者换句话说,应该定位并加载与生成中使用的版本相同的版本,而不是任何其他版本。如果对程序集进行签名,公钥也将起作用

问题是,在我为测试而创建的虚拟应用程序中,这个规则被打破了!我已经搜索了SO和google,答案都是错误的。请不要告诉我以下原因、解决方法:

  • “Specific Version”设置为False:这仅在编译时为true,与运行时无关
  • 此外,没有应用程序或计算机配置集
在我的测试设置中,我有一个引用项目B的项目A。在对每个项目B进行版本控制后,我更改项目B,只生成它自己,而不是A。现在,我将带有更改版本的新B.DLL复制到A的工作目录中,并运行A。它可以工作!!我想它会崩溃

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

日志:程序集名称为:dllProj,版本=1.1.10.8,区域性=neutral, PublicKeyToken=null


在MSDN的

没有对没有强名称的程序集进行版本检查,也没有 运行时是否在全局程序集缓存中检查程序集 没有强有力的名字


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

您是否尝试过更改第一个或第二个元素(主要/次要)版本号的定义?我很确定发布者策略可以应用于主要版本和次要版本,但程序集解析与精确匹配有关。然而,在我看来,“私有程序集”并没有强制执行版本控制,也许?正确答案:)我很高兴当时没有人回答这个问题。
*** 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.