2

我正在尝试创建一个程序集,但我的远程 sql 服务器无法访问我的 .dll 文件。

create assembly BarcodeSql 
from 'X:\test.dll' 
WITH PERMISSION_SET = SAFE

我不知道如何将 test.dll 放在我的 sql 服务器上,但我知道我可以发送一个序列化的 dll 而不是 dll 的路径。如何序列化dll?我似乎无法弄清楚。

4

2 回答 2

7

我正在尝试创建一个程序集,但我的远程 sql 服务器无法访问我的 .dll 文件。

这是因为它X:\在运行 SQL 实例的服务器上查找,而不是从运行 SQL 的位置。

如何序列化dll?

您可以在 CREATE ASSEMBLY 中指定网络路径:

create assembly BarcodeSql 
from '\\yourmachine\sharetox\test.dll' 
WITH PERMISSION_SET = SAFE

或者,你真的可以序列化它。使用 PowerShell:

"0x" + [System.BitConverter]::ToString([System.IO.File]::ReadAllBytes("X:\text.dll")).Replace("-", "")

这将打印出一些大的十六进制值。然后,您可以在创建程序集时使用 VARBINARY 文字:

create assembly BarcodeSql 
from 0x23456789
WITH PERMISSION_SET = SAFE

其中 0x123456789 是 powershell 脚本的输出。

于 2012-07-09T18:05:57.667 回答
1

它只是简单的二进制表示。您可以使用任何 HEX 编辑器,或类似的东西:

public string GetAssemblyBits(string 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();
}

此外,您可以从网络路径加载程序集。

CREATE ASSEMBLY assembly_name
[ AUTHORIZATION owner_name ]
FROM { <client_assembly_specifier> | <assembly_bits> [ ,...n ] }
[ WITH PERMISSION_SET = { SAFE | EXTERNAL_ACCESS | UNSAFE } ]
[ ; ]
<client_assembly_specifier> :: =
        '[\\computer_name\]share_name\[path\]manifest_file_name'
  | '[local_path\]manifest_file_name'

<assembly_bits> :: =
{ varbinary_literal | varbinary_expression }
于 2012-07-09T18:02:13.693 回答