2

我可以像 MSSMS 生成的程序集脚本一样从流中创建程序集吗?我需要从放置在 SQL Server 无权访问的目录中的 DLL 创建程序集。
不过,程序集安装程序确实可以访问程序集。
所以我的问题是:我可以读取程序集并从读取的流中生成创建吗?

谢谢。

4

3 回答 3

1

我想我想通了。
我正在使用 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 语句。
编写代码时考虑到了一个小的 DLL 程序集。

于 2010-01-13T11:22:40.110 回答
1

我惊喜地发现,当您构建 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...];
于 2014-10-03T18:22:27.980 回答
0

支持 SQLCLR(在 SQL Server 2005 中引入)的 Visual Studio / SSDT(从 Visual Studio 2005 开始)的初始版本确实依赖于 DLL 和CREATE ASSEMBLY在发布/部署脚本的命令中对它的文件系统引用。但是,在 Visual Studio 2012 中,该方法已被脚本化 VARBINARY 文字(即文档引用的十六进制字节字符串)所取代。因此,从那时起使用 Visual Studio / SSDT 的任何人都不必手动执行此步骤,如果使用生成的部署脚本的话。如果您不使用 SSDT 生成的部署脚本,那么将 DLL 转换为此 VARBINARY 文字的最佳方法是我创建的一个开源实用程序:

  • 通过使用line-continuation来处理非常长的十六进制字节行。这使得脚本在 SSMS 和其他不能很好地处理超过 100k 字符的单行的编辑器中变得更易读和更易于管理。
  • 输出到文件(用于自动化/包括部署脚本中的输出),或直接输出到剪贴板(与添加到 Windows 登录的 SendTo 文件夹的快捷方式一起使用,允许右键单击 DLL,然后只需粘贴到您正在编辑的脚本中)。

代码(和预编译的 EXE)可以在 GitHub 上找到:BinaryFormatter

有关在 SQL Server 2017 及更高版本中使用 SQLCLR 的信息,请参阅我的博客文章:

有关一般使用 SQLCLR 的更多信息,请访问:SQLCLR 信息

于 2018-10-25T16:29:40.563 回答