通过查询在 SQL 服务器上获取 SQLCLR 程序集的目标框架版本
Get Target Framework Version of SQLCLR Assemblies on SQL Server via Query
我们有许多使用 .NET 2.0 或 .NET 3.5 编译的程序集。
有没有办法通过未记录的 table、函数等 - 可以查询数据库中的程序集列表并获取程序集的 .NET 版本?
我们查询到sys.assemblies
确实包含各种程序集信息,但不包含目标框架版本。
我们正在将我们的 08R2 实例升级到 Windows Server 2012,并且需要了解哪些程序集当前针对 .NET 2.0 框架,而不是 3.5 框架,因此我们可以重新编译它们(或替换,如我们有许多来自 NuGet 包的程序集,目前尚不清楚它们是否以 .NET 3.5 为目标。
您可以查看以下输出:
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
不,没有获取此信息的机制(至少我从未见过或听说过)。如果此信息可通过反射获得,那么您可以创建一个 SQLCLR 存储过程或函数来读取 sys.assembly_files
的 content
列并尝试从那里提取它。
但是,您可能不需要此信息。如果唯一的原因是确定在从 SQL Server 2008 R2 过渡到 SQL Server 2012 时可能需要重新编译的内容,那么:
- 为 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 程序集。但是....
- 幸运的是,您很可能根本不需要重新编译任何东西。 .NET 对大多数 类 具有向后兼容性,因此为 2.0 编译的内容应该仍然适用于所有未来的框架版本。事实上,我的 SQL# 项目中的所有程序集都使用了 2.0 的目标框架版本,但可能是其中一个程序集,这样它们就可以在从 2005 年开始的所有 SQL 服务器版本上工作。我还没有 运行 遇到任何问题 运行,我的大部分初始测试是在 SQL Server 2012 上完成的,而我在 2014 年和 2016 年进行了额外测试,目前还没有遇到任何问题。最大的 "issues" 是框架版本之间默认值或行为的微小变化(例如 "enlist" 连接字符串关键字将其默认值从
false
更改为 true
之一升级等等)。
我们有许多使用 .NET 2.0 或 .NET 3.5 编译的程序集。
有没有办法通过未记录的 table、函数等 - 可以查询数据库中的程序集列表并获取程序集的 .NET 版本?
我们查询到sys.assemblies
确实包含各种程序集信息,但不包含目标框架版本。
我们正在将我们的 08R2 实例升级到 Windows Server 2012,并且需要了解哪些程序集当前针对 .NET 2.0 框架,而不是 3.5 框架,因此我们可以重新编译它们(或替换,如我们有许多来自 NuGet 包的程序集,目前尚不清楚它们是否以 .NET 3.5 为目标。
您可以查看以下输出:
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
不,没有获取此信息的机制(至少我从未见过或听说过)。如果此信息可通过反射获得,那么您可以创建一个 SQLCLR 存储过程或函数来读取 sys.assembly_files
的 content
列并尝试从那里提取它。
但是,您可能不需要此信息。如果唯一的原因是确定在从 SQL Server 2008 R2 过渡到 SQL Server 2012 时可能需要重新编译的内容,那么:
- 为 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 程序集。但是....
- 幸运的是,您很可能根本不需要重新编译任何东西。 .NET 对大多数 类 具有向后兼容性,因此为 2.0 编译的内容应该仍然适用于所有未来的框架版本。事实上,我的 SQL# 项目中的所有程序集都使用了 2.0 的目标框架版本,但可能是其中一个程序集,这样它们就可以在从 2005 年开始的所有 SQL 服务器版本上工作。我还没有 运行 遇到任何问题 运行,我的大部分初始测试是在 SQL Server 2012 上完成的,而我在 2014 年和 2016 年进行了额外测试,目前还没有遇到任何问题。最大的 "issues" 是框架版本之间默认值或行为的微小变化(例如 "enlist" 连接字符串关键字将其默认值从
false
更改为true
之一升级等等)。