通过Query在SQL Server上获取SQLCLR程序集的目标框架版本

时间:2017-04-11 13:06:02

标签: .net sql-server sql-server-2008-r2 clr sqlclr

我们有许多使用.NET 2.0或.NET 3.5编译的程序集。

有没有办法,通过未记录的表,函数等 - 可以查询数据库中的程序集列表并获取程序集的.NET版本?

我们查询了sys.assemblies,其中包含各种程序集信息,但不包含目标框架版本。

我们正在将我们的08R2实例升级到Windows Server 2012,并且需要了解哪些程序集当前面向.NET 2.0框架,而不是3.5框架,因此我们可以针对重新编译它们(或替换,因为我们有许多程序集来自NuGet包,目前尚不清楚它们是否以.NET 3.5为目标。)

2 个答案:

答案 0 :(得分:1)

不,没有获取此信息的机制(至少不是我见过或听说过的)。如果此信息可通过Reflection获得,那么您可以创建一个SQLCLR存储过程或函数来读取content的{​​{1}}列,并尝试从那里提取它。

但是,您可能不需要此信息。如果唯一的原因是确定从SQL Server 2008 R2过渡到SQL Server 2012时可能需要重新编译的内容,那么:

  1. 在为2.0编译的目标和3.5目标程序集之间没有真正的区别。 2008 R2链接到CLR 2.0,其中包括.NET Framework版本2.0,3.0,3.5,而2012和更新版本链接到使用.NET Framework 4.0及更高版本的CLR 4.0。因此,当您转移到SQL Server 2012时,为2.0编译的程序集和使用3.5的程序集都将链接到您不会使用的CLR版本。因此,如果需要重新编译2.0程序集,您可能还需要重新编译3.5程序集。但....
  2. 幸运的是,你很可能根本不需要重新编译任何东西。 .NET具有大多数类的向后兼容性,因此为2.0编译的东西仍应适用于所有未来的Framework版本。实际上,我在SQL#项目中的所有程序集中都使用了2.0的目标框架版本,以便它们可以在从2005开始的所有SQL Server版本中运行。我还没有遇到运行问题任何事情,我的大多数初步测试都是在SQL Server 2012上完成的,而我在2014年和2016年进行了额外的测试,并且没有遇到任何问题。最大的"问题"对Framework版本之间的默认值或行为进行了微小更改(例如" enlist" Connection String关键字在其中一个升级中将其默认值从sys.assembly_files更改为false像那样)。

答案 1 :(得分:0)

您可以查看输出:

select * from sys.dm_clr_properties

你应该得到类似的东西:

name        value
-----------------------------------
directory   C:\Windows\Microsoft.NET\Framework64\v4.0.30319\
version     v4.0.30319
state       CLR is initialized