如何找出SpecificVersion引用属性的值?

时间:2012-07-25 18:13:05

标签: c# reflection .net-4.0 reference

我有一个二进制文件(我们称之为DllParent),它引用了另一个DLL(DllChild)。添加引用时,我们可以选择将SpecificVersion属性设置为true或false。

enter image description here

在Reflector(或类似工具)中查看DllParent时,有没有办法找出开发人员是否将DllChild的SpecificVersion属性设置为true或false?

1 个答案:

答案 0 :(得分:1)

答案是否定的。

当您向项目中添加对强名称程序集的引用时,Visual Studio会在.csproj文件中存储包含版本的完整强名称。

然后在每次构建期间,当MSBuild代码尝试解析程序集引用时,即找到它可以在构建期间使用的实际程序集文件,如果SpecificVersion设置为true,那么版本在.dll必须与项目文件中指定的版本匹配。

这可能会出现一个问题,即如果要升级到程序集的新版本,则需要更改所有使用该程序集的项目中的引用,否则构建将失败,因此为了简化您的生活可以将SpecificVersion设置为false

在这种情况下,如果某些方法签名已更改,则升级后构建仍可能失败。如果在编译项目时遇到错误但是如果在运行时允许发生同样的事情,那么这将是糟糕但可修复的,对于最终用户而言,这将带来严重的问题。

因此,.Net不允许通过强制严格匹配构建时使用的确切版本来实现此目的,而不管项目文件中SpecificVersion的值是什么。

MSBuild只是将带有程序集引用的版本存储在二进制.dll文件中,然后使用Reflector检查它只会显示MSBuild实际使用的引用程序集的版本,而不是它如何解析项目的引用。

引用程序集的开发人员仍然可以指定可以安全地使用新版本而不是旧版本,但这是通过不同的机制完成的:

  1. 如果公共接口已更改但以与旧版本兼容的方式(假设添加方法兼容但不删除或更改参数),则可以与新版本一起部署策略文件告诉.Net系统这是一个安全的替代品。 (http://msdn.microsoft.com/en-us/library/dz32563a.aspx)

  2. 如果公共接口完全相同且只更改了方法的内部实现,那么引用的程序集的开发人员可以保持相同的AssemlyVersion值但更改AssemblyFileVersion。在这种情况下,您可以在Windows资源管理器中看到的文件版本将更新,但强名称将保持不变。这就是微软在更新时所做的事情,比如System.dll

  3. 在这两种情况下,引用程序集(问题中的DllParent)仍然会包含原始版本号。