我正在尝试创建一个程序集,但我的远程 sql 服务器无法访问我的 .dll 文件。
create assembly BarcodeSql
from 'X:\test.dll'
WITH PERMISSION_SET = SAFE
我不知道如何将 test.dll 放在我的 sql 服务器上,但我知道我可以发送一个序列化的 dll 而不是 dll 的路径。如何序列化dll?我似乎无法弄清楚。
我正在尝试创建一个程序集,但我的远程 sql 服务器无法访问我的 .dll 文件。
create assembly BarcodeSql
from 'X:\test.dll'
WITH PERMISSION_SET = SAFE
我不知道如何将 test.dll 放在我的 sql 服务器上,但我知道我可以发送一个序列化的 dll 而不是 dll 的路径。如何序列化dll?我似乎无法弄清楚。
我正在尝试创建一个程序集,但我的远程 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 脚本的输出。
它只是简单的二进制表示。您可以使用任何 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 }