我有一个引用另一个 DLL (DllChild) 的二进制文件(我们称之为 DllParent)。添加引用时,我们可以选择将SpecificVersion
属性设置为 true 或 false。
在 Reflector(或类似工具)中查看 DllParent 时,有没有办法找出开发人员是否将 DllChild 的 SpecificVersion 属性设置为 true 或 false?
我有一个引用另一个 DLL (DllChild) 的二进制文件(我们称之为 DllParent)。添加引用时,我们可以选择将SpecificVersion
属性设置为 true 或 false。
在 Reflector(或类似工具)中查看 DllParent 时,有没有办法找出开发人员是否将 DllChild 的 SpecificVersion 属性设置为 true 或 false?
答案是不。
当您向项目添加对强命名程序集的引用时,Visual Studio 会将包含版本的完整强名称存储在您的 .csproj 文件中。
然后在每次构建期间,当 MSBuild 代码尝试解析程序集引用时,即找到它可以在构建期间使用的实际程序集文件,如果SpecificVersion
设置为,true
则 .dll 中的版本必须与项目中指定的版本匹配文件。
这可能会带来一个问题,如果您想升级到新版本的程序集,您需要更改所有使用该程序集的项目中的引用,否则构建会失败,因此为了简化您的生活,您可以设置SpecificVersion
到false
.
在这种情况下,如果某些方法签名已更改,您的构建仍可能在升级后失败。如果您在编译项目时遇到错误,这会很糟糕但可以修复,但如果在运行时允许发生同样的事情,对于最终用户来说,这将是一个严重的问题。
因此,.Net 不允许通过强制严格匹配构建期间使用的确切版本来发生这种情况,而不管SpecificVersion
项目文件中的值如何。
MSBuild 只是将带有程序集引用的版本存储在二进制 .dll 文件中,然后使用 Reflector 检查它只会显示 MSBuild 实际使用的引用程序集的版本,而不是它如何解析项目的引用。
引用程序集的开发人员仍然可以指定可以安全地使用新版本而不是旧版本,但这是通过不同的机制完成的:
如果公共接口已更改但与旧版本兼容(例如添加方法兼容但删除或更改参数不兼容),则可以将策略文件与新版本一起部署以告诉 .Net 系统这是一个安全的替代品。(http://msdn.microsoft.com/en-us/library/dz32563a.aspx)
如果公共接口完全一样,只是方法的内部实现发生了变化,那么被引用程序集的开发人员可以保持相同的AssemlyVersion
值但改变AssemblyFileVersion
。在这种情况下,您可以在 Windows 资源管理器中看到的文件版本将被更新,但强名称将保持不变。这就是微软在更新 System.dll 时所做的事情
在这两种情况下,引用程序集(您的问题中的 DllParent)仍将包含原始版本号。