"例如,产品的2.0版可能包含多个程序集;一个这些集会被标记为版本1.0,因为它是一个新的程序集没有在1.0版中发布的相同的产品。通常,您设置这个版本的主要和次要部分代表公共版本的数字你的产品。然后你增加每次的构建和修订部分你包装一个完整的产品所有的集会”。-Jeffrey Richter,[CLR via C#(第二版)]p.57
对于整个AssemblyVersion是否必须完全匹配才能加载程序集,存在一些混淆。有些人错误地认为只有AssemblyVersion的主要部分和次要部分必须匹配才能绑定成功。这是一个合理的假设,但最终它是不正确的(从. NET 3.5开始),并且为您的CLR版本验证这一点是微不足道的。只需执行此示例代码。
在我的机器上,第二次装配加载失败,融合日志的最后两行非常清楚地说明了原因:
.NET Framework Version: 2.0.50727.3521---Attempting to load assembly: Rhino.Mocks, Version=3.5.0.1337, Culture=neutral, PublicKeyToken=0b3305902db7183fSuccessfully loaded assembly: Rhino.Mocks, Version=3.5.0.1337, Culture=neutral, PublicKeyToken=0b3305902db7183f---Attempting to load assembly: Rhino.Mocks, Version=3.5.0.1336, Culture=neutral, PublicKeyToken=0b3305902db7183fAssembly binding for failed:System.IO.FileLoadException: Could not load file or assembly 'Rhino.Mocks, Version=3.5.0.1336, Culture=neutral,PublicKeyToken=0b3305902db7183f' or one of its dependencies. The located assembly's manifest definitiondoes not match the assembly reference. (Exception from HRESULT: 0x80131040)File name: 'Rhino.Mocks, Version=3.5.0.1336, Culture=neutral, PublicKeyToken=0b3305902db7183f'
=== Pre-bind state information ===LOG: User = Phoenix\DaniLOG: DisplayName = Rhino.Mocks, Version=3.5.0.1336, Culture=neutral, PublicKeyToken=0b3305902db7183f(Fully-specified)LOG: Appbase = [...]LOG: Initial PrivatePath = NULLCalling assembly : AssemblyBinding, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.===LOG: This bind starts in default load context.LOG: No application configuration file found.LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v2.0.50727\config\machine.config.LOG: Post-policy reference: Rhino.Mocks, Version=3.5.0.1336, Culture=neutral, PublicKeyToken=0b3305902db7183fLOG: Attempting download of new URL [...].WRN: Comparing the assembly name resulted in the mismatch: Revision NumberERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.
"加载程序集时,CLR将自动查找最新的安装的服务版本匹配的主要/次要版本要求集会”。-Jeffrey Richter,[CLR via C#(第二版)]p.56
这是1.0 CLR的Beta 1中的行为,但是此功能在1.0版本之前已被删除,并且尚未在. NET 2.0中重新出现:
"注意:我刚刚描述了你如何应该考虑版本号。不幸的是CLR不能治疗版本号以这种方式。[在. NET2.0],CLR将版本号视为不透明值,如果程序集取决于另一个版本1.2.3.4程序集,CLR尝试加载仅1.2.3.4版本(除非绑定重定向已到位)。但是,微软计划改变CLR的加载器在未来的版本,所以它装的是最新的构建/修改给定的主要/次要程序集的版本。例如,在CLR的未来版本中,如果加载器正在尝试查找版本1.2.3.4程序集和版本1.2.5.0存在,加载程序会自动获取最新的服务版本。这将是一个非常欢迎更改CLR的加载程序-I一个不能等”。-Jeffrey Richter,[CLR via C#(第二版)]第164页(强调)我的)