.net 创建程序集失败,返回“0”;无法解析令牌";

.net 创建程序集失败,返回“0”;无法解析令牌";,.net,sql-server,.net-assembly,sqlclr,sql-server-2016,.net,Sql Server,.net Assembly,Sqlclr,Sql Server 2016,我正在尝试将一些CLR代码上载到SQL Server 2016(开发者版)实例。总体而言,结构如下所示: 一个CLR UDF取决于程序集A 另一个CLR UDF取决于程序集B A和B都取决于组件C .sqlproj的目标框架是4.0。程序集A和B是针对.net4.0构建的。程序集C是针对.net2.0构建的。所有程序集都设置为型号识别:True,权限集:Safe。未对所有程序集进行签名 当我将.sqlproj发布到数据库服务器时,程序集C和B运行良好,但程序集A出现以下故障: (276,1)

我正在尝试将一些CLR代码上载到SQL Server 2016(开发者版)实例。总体而言,结构如下所示:

  • 一个CLR UDF取决于程序集
    A
  • 另一个CLR UDF取决于程序集
    B
  • A
    B
    都取决于组件
    C
.sqlproj的目标框架是4.0。程序集
A
B
是针对.net4.0构建的。程序集
C
是针对.net2.0构建的。所有程序集都设置为
型号识别:True
权限集:Safe
。未对所有程序集进行签名

当我将.sqlproj发布到数据库服务器时,程序集
C
B
运行良好,但程序集
A
出现以下故障:

(276,1): SQL72014: .Net SqlClient Data Provider: Msg 6218, Level 16, State 2, Line 1 CREATE ASSEMBLY for assembly 'A' failed because assembly 'A' failed verification. Check if the referenced assemblies are up-to-date and trusted (for external_access or unsafe) to execute in the database. CLR Verifier error messages if any will follow this message [ : A.Class1::Method1][mdToken=0x6000010][offset 0x00000001] Unable to resolve token. [ : A.Class2::Method2][mdToken=0x6000014][offset 0x0000004C] Unable to resolve token. [ : A.Class3::Method3][mdToken=0x6000017][offset 0x00000001] Unable to resolve token. [ : A.Class4::Method4][mdToken=0x6000021][offset 0x0000000C] Unable to resolve token. (276,0): SQL72045: Script execution error. The executed script: CREATE ASSEMBLY [A] AUTHORIZATION [dbo] FROM 0x4D5A9...002A0 在开发人员计算机上:

PSChildName Version Release Product ----------- ------- ------- ------- v2.0.50727 2.0.50727.4927 v3.0 3.0.30729.4926 Windows Communication Foundation 3.0.4506.4926 Windows Presentation Foundation 3.0.6920.4902 v3.5 3.5.30729.4926 Client 4.6.01038 394254 4.6.1 Full 4.6.01038 394254 4.6.1 Client 4.0.0.0 PSChildName版本发布产品 ----------- ------- ------- ------- v2.0.50727 2.0.50727.4927 v3.0 3.0.30729.4926 Windows通信基金会3.0.4506926 Windows演示文稿基础3.0.6920.4902 v3.5 3.5.30729.4926 客户4.6.01038 394254 4.6.1 完整4.6.01038 394254 4.6.1 客户端4.0.0.0 我似乎无法将dev计算机上的.NET更新为与服务器相同的版本。可能是因为开发人员计算机的Windows设置为延迟更新。。。但是,这种版本不匹配会成为问题的根源吗

更新2:显然,这些.NET版本是各自平台的最新版本()

更新3:我尝试了一些进一步的东西

将数据库项目部署到本地SQL Server 2016 Express数据库会产生相同的结果,因此开发和服务器框上的.NET版本不匹配似乎不是问题所在

此外,在部署到LocalDB v12.0(SQL Server 2014引擎)时,也观察到了完全相同的行为,所以问题可能并不特别是SQL Server 2016


在Windows Server上安装.NET 3.5(
Install WindowsFeature NET Framework Core
)也不会影响这种情况。

我的测试表明,这里的问题是如何指定对BigInteger类库的引用。查看PaillierExt.csproj文件,它显示了包含版本信息的引用:


但是,ElGamalExt.csproj文件将引用(针对同一DLL)显示为DLL的名称:


数据库项目中引用的默认行为似乎是,如果给定版本,则该引用隐含为
version Specific=false
,而在类库中,如果给定版本,则该引用隐含为
version Specific
。在这种情况下,将引用显式设置为
Specific Version=false
,可能会有所帮助

通过将源代码(不起作用的原始代码,而不是移动内容的更新代码)复制到3个新创建的类库项目中,我成功地构建和加载了所有3个项目。我将诸如项目GUID和引用之类的内容复制到新的.csproj文件中,但没有复制该特定引用的特定版本信息。然后,我能够创建一个数据库项目和一个SQLCLR对象,该对象引用了PaillierExtElGamalExt方法。一切如期进行

我相信这也解释了当程序集注册为
PERMISSION\u SET=UNSAFE
时它工作的原因:很可能是特定版本信息和隐含的
specific version=true
属性是对CLR的建议,当程序集是
SAFE
外部访问
,但将其设置为
不安全
允许通过传递指定的首选项

另外,我不确定这是否重要,但与我通常所做的另一个不同之处是,在AssemblyInfo.cs文件中,
AssemblyVersion
属性对构建使用了
*
。我没有发现这是一个复杂的因素,但是如果有人在从引用中删除特定于版本的信息后仍然存在问题,那么尝试用静态值替换
*
。原因是,如果版本需要“特定”,那么让部分版本在每个版本上更改可能没有帮助


有关测试等的详细信息,请参见。

程序集“A”使用的是什么
权限集
?你们的集会签名了吗?您是否尝试过在SQL的早期版本上加载这些程序集Server@srutzky我在帖子中添加了这个信息。所有程序集都是
permission\u SET=SAFE
,没有对任何程序集进行签名。我没有访问SQL Server 2014的权限,因此我没有尝试。但我可能会开始用MSSQLS2014准备一个VM来测试它。好的。您可以将它们设置为
不安全
,尽管我不建议在生产中使用,但为了更快/更容易测试,请将DB设置为
可信=ON
。另外,SQL Server 2016实例是否正在您的开发设备上运行?如果不是,它是否与您的dev box处于相同的.NET Framework修补程序级别?@srutzky用更多信息更新了该问题!非常感谢您的帮助和为解决此问题所付出的所有努力。真的很感激! PSChildName Version Release Product ----------- ------- ------- ------- v2.0.50727 2.0.50727.4927 v3.0 3.0.30729.4926 Windows Communication Foundation 3.0.4506.4926 Windows Presentation Foundation 3.0.6920.4902 v3.5 3.5.30729.4926 Client 4.6.01038 394254 4.6.1 Full 4.6.01038 394254 4.6.1 Client 4.0.0.0