2012-07-09 63 views
1

我試圖創建一個程序集,但是我的遠程sql服務器無法訪問我的.dll文件。在遠程sql server上部署.dll?

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

我不知道如何把我的Test.dll的SQL Server上,但我知道我可以發送,而不是路徑的dll序列化DLL。我怎樣才能序列化的DLL?我似乎無法弄清楚。

回答

5

我試圖創建一個裝配,但我的遠程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腳本的輸出。

+0

如何從這裏創建一個過程?我的C#函數接受參數並返回一個值。 – sooprise 2012-07-09 18:17:02

+0

@sooprise你可以使用'CREATE PROCEDURE .... AS EXTERNAL NAME assembly_name.class_name.method_name'。請參閱[MSDN文檔](http://msdn.microsoft.com/zh-cn/library/ms187926.aspx) – vcsjones 2012-07-09 18:33:08

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 }