我可以像 MSSMS 生成的程序集脚本一样从流中创建程序集吗?我需要从放置在 SQL Server 无权访问的目录中的 DLL 创建程序集。
不过,程序集安装程序确实可以访问程序集。
所以我的问题是:我可以读取程序集并从读取的流中生成创建吗?
谢谢。
我可以像 MSSMS 生成的程序集脚本一样从流中创建程序集吗?我需要从放置在 SQL Server 无权访问的目录中的 DLL 创建程序集。
不过,程序集安装程序确实可以访问程序集。
所以我的问题是:我可以读取程序集并从读取的流中生成创建吗?
谢谢。
我想我想通了。
我正在使用 Tomalak 的 Byte Array to Hexadecimal 方法从这篇文章。
private string getAssemblyAsHex(string asmPath)
{
using (BinaryReader br = new BinaryReader(File.OpenRead(asmPath)))
{
byte[] buff = new byte[br.BaseStream.Length];
br.Read(buff, 0, buff.Length - 1);
return ByteArrayToString(buff);
}
}
private static string ByteArrayToString(byte[] ba)
{
StringBuilder hex = new StringBuilder(ba.Length * 2);
foreach (byte b in ba)
hex.AppendFormat("{0:x2}", b);
return hex.ToString();
}
然后我只是将此字符串连接到 CREATE ASSEMBLY 语句。我惊喜地发现,当您构建 SQL CLR 项目时,Visual Studio 2013 会使用 CREATE ASSEMBLY 调用中使用的位字符串自动生成一个 SQL 脚本。
构建项目,然后在 bin 文件夹中使用 DacUnpack.exe 解压缩“*.dacpac”文件。在解压后的文件夹中查找“model.sql”。它包含一个 CREATE ASSEMBLY 调用,如下所示:
CREATE ASSEMBLY [MyFunctions]
AUTHORIZATION [dbo]
FROM 0x4D5A90000[very long string here...];
支持 SQLCLR(在 SQL Server 2005 中引入)的 Visual Studio / SSDT(从 Visual Studio 2005 开始)的初始版本确实依赖于 DLL 和CREATE ASSEMBLY
在发布/部署脚本的命令中对它的文件系统引用。但是,在 Visual Studio 2012 中,该方法已被脚本化 VARBINARY 文字(即文档引用的十六进制字节字符串)所取代。因此,从那时起使用 Visual Studio / SSDT 的任何人都不必手动执行此步骤,如果使用生成的部署脚本的话。如果您不使用 SSDT 生成的部署脚本,那么将 DLL 转换为此 VARBINARY 文字的最佳方法是我创建的一个开源实用程序:
代码(和预编译的 EXE)可以在 GitHub 上找到:BinaryFormatter
有关在 SQL Server 2017 及更高版本中使用 SQLCLR 的信息,请参阅我的博客文章:
有关一般使用 SQLCLR 的更多信息,请访问:SQLCLR 信息