2017-04-11 28 views
1

我们有许多使用.NET 2.0或.NET 3.5编译的程序集。通过查询在SQL Server上获取SQLCLR程序集的目标框架版本

有没有一种方法,通过一个未公开的表,函数等 - 人们可以查询数据库中的程序集列表并获取程序集的.NET版本?

我们查询了sys.assemblies,它包含各种汇编信息,但不包括目标框架版本。

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

回答

1

没有,有没有机制以获取该信息(至少不是我所看过看到或听说过)。如果此信息可通过反射获得,那么您可以创建一个SQLCLR存储过程或函数来读取content列的sys.assembly_files并尝试从那里提取它。

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

  1. 对于2.0和3.5目标程序集编译的内容没有真正的区别。 2008 R2与CLR 2.0相关联,该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 Assemblies,那么您可能还需要重新编译3.5 Assemblies。但是......
  2. 幸运的是,你很可能不需要重新编译任何东西。 .NET对大多数类具有向后兼容性,因此为2.0编译的东西仍然适用于所有未来的Framework版本。事实上,我对我的SQL#项目中的所有组件都使用了目标框架版本2.0,以便它们可以在2005年开始的所有SQL Server版本上运行。我还没有遇到任何运行问题,并且大多数的我最初的测试是在SQL Server 2012上完成的,而我在2014和2016年做了额外的测试,没有遇到任何问题。最大的“问题”是Framework版本之间的默认值或行为的轻微变化(例如,通过升级之一的“登记”连接字符串关键字将其默认值从false更改为true等)。
+0

我们遇到了某个特定程序集的问题,该程序集的操作系统已升级到Windows Server直到我们将目标框架从.NET 2.0改为3.5之后,它才开始工作。 –

+0

@ElliotRodriguez在这种情况下,我认为真正的问题可能是机器从未安装完整的2.0 Framework。如果再遇到这个问题,我会确保安装2.0本身,而不是以3.5开头。我猜可能某些东西无法按预期工作,即使具有向后兼容性,或者向后兼容性要求以前的Framework版本已完全安装。你的装配到底在做什么?它使用的是我可以测试的任何特定类?我没有看到更改为3.5会做什么。 –

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 
+0

我的问题不清楚(它已被改写)。我试图获得程序集的目标框架版本 - 而不是服务器上.NET CLR的版本。 我们正在将我们的08R2实例升级到Windows Server 2012,并且需要了解哪些程序集当前的目标是.NET 2.0框架,而不是3.5框架,因此我们可以针对重新编译它们(或替换,因为我们有许多程序集NuGet包,目前还不清楚它们是否以.NET 3.5为目标) –

+0

'SELECT * FROM sys。程序集“,如果这个查询可能包含一个定义目标框架版本的列,基本上与VS项目文件包含的元数据相同,这就是我们正在寻找的。检查'sys.assemblies'视图会产生'ASSEMBLYPROPERTY',它接近但没有目标框架版本。 https://docs.microsoft.com/en-us/sql/t-sql/functions/assemblyproperty-transact-sql –

相关问题