CLR SQL程序集:如何获取字节流?

16
我有一个SQL CLR dll需要部署,但是我发现可以将字节流/ varbinary_literal/ varbinary_expression/assembly bits 嵌入文本文件中,以避免打包DLL并确保其可以访问的麻烦。这样做可以解决使用 CREATE ASSEMBLY 命令 的问题。
但是我还没有找到如何获取那个字节流/varbinary_literal/varbinary_expression/assembly bits值。我没有找到任何一致的术语,并且一直在使用 Load()

SELECT @assemblyBinary = AF.content FROM sys.assemblies AS A INNER JOIN sys.assembly_files AS AF ON A.assembly_id = AF.assembly_id WHERE A.name = 'Assembly_CLRFunction' - Mohammad Afrashteh
1
我会说正确的术语应该是一个十六进制字符串。 - Matthias Güntert
2个回答

26

这只是dll的十六进制表示。这段代码应该可以解决问题:

    static string GetHexString(string assemblyPath)
    {
        if (!Path.IsPathRooted(assemblyPath))
            assemblyPath = Path.Combine(Environment.CurrentDirectory, assemblyPath);

        StringBuilder builder = new StringBuilder();
        builder.Append("0x");

        using (FileStream stream = new FileStream(assemblyPath,
              FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            int currentByte = stream.ReadByte();
            while (currentByte > -1)
            {
                builder.Append(currentByte.ToString("X2", CultureInfo.InvariantCulture));
                currentByte = stream.ReadByte();
            }
        }

        return builder.ToString();
    }

你应该像这样使用生成的字符串:

string hexString = GetHexString(assemblyPath);
string sql = "CREATE ASSEMBLY [" + assemblyName + "] FROM " + hexString + 
             " WITH PERMISSION_SET = " + somePermissionSet;

2
谢谢 - 十六进制信息引导我找到了这段代码:http://blog.waldenl.com/2009/12/command-line-hex-representation-of-file.html - OMG Ponies
那基本上是相同的循环,对吧 :) - Sander Rijken

9

这里发现,可以通过使用 SQL Server Management Studio(SSMS)和本地 SQL Server 实例来生成 varbinary,无需自定义代码。

  1. create or alter your assembly in your database using its local path on your local SQL Server.

    use yourBase
    go
    create assembly YourAssemblySqlName from N'YourLocalPath\YourAssemblyFile.dll'
    go
    
  2. Browse to your assembly in Object Explorer.

    Browsing to assembly

  3. Script its creation.

    Scripting the assembly

SSMS提供了varbinary


5
您也可以这样获取它: SELECT af.content FROM sys.assemblies a INNER JOIN sys.assembly_files af ON a.assembly_id = af.assembly_id WHERE a.name = <@assemblyName> - rahvin_t
1
@rahvin_t 不错的查询,但在“where”子句中,您可能想要将目标/更改为“af”别名,而不是“A”别名-例如'af.name = ...',以防已加载(调试)“PDB”程序集。 - DennisVM-D2i

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接