1

Webサービスを呼び出すために、私はC#.NET 2.0でDLLを作成しました。アセンブリの検索ディレクトリ

SQL Server 2008 R2にDLLを登録した後、このDLLで構成ファイルを読み込むためにディレクトリを取得しようとしました。

Googleで見つかったすべての方法は機能しません。問題はファイルを読み込めないためです。環境に応じて変更することができるため、コード内にいくつかの「ハードパス」を入れたくありません。

私はSQL Server 2008で私のDLLを登録する方法があります:

DROP FUNCTION [Tools].[CallWriteDepot] 
GO 
DROP FUNCTION [Tools].[CallExtractDepot] 
GO 
drop assembly SqlAssembly 
go 

create assembly SqlAssembly 
from 'C:\webservices\dll\SqlAssembly.dll' 
with permission_set = unsafe 
go 
--------------------------------------------------------------------------------------------------- 
CREATE FUNCTION [Tools].[CallWriteDepot](@xmlInputFile [nvarchar](max)) 
RETURNS [nvarchar](max) WITH EXECUTE AS CALLER 
AS 
EXTERNAL NAME [SqlAssembly].[SqlAssembly.Main].[writeToSafe] 
GO 

--------------------------------------------------------------------------------------------------- 
CREATE FUNCTION [Tools].[CallExtractDepot](@xmlInputFile [nvarchar](max)) 
RETURNS [nvarchar](max) WITH EXECUTE AS CALLER 
AS 
EXTERNAL NAME [SqlAssembly].[SqlAssembly.Main].[readFromSafe] 
GO 

見ての通り、DLLはC:\ Webサービス\ dllファイルの\ SqlAssembly.dll、この道を見つけることは不可能です以下に示すように、DLLコード。いくつかのテストの後に結果があり

Assembly.GetAssembly(typeof(SqlAssembly.Main)).CodeBase 
Result : empty 
attrTest2.Value = Assembly.GetAssembly(typeof(SqlAssembly.Main)).Location 
Result : empty 
Assembly.GetCallingAssembly().Location 
Result : C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Binn\SqlAccess.dll 
Assembly.GetCallingAssembly().GetName().CodeBase 
Result : file:///C:/Program Files/Microsoft SQL Server/MSSQL10_50.MSSQLSERVER/MSSQL/Binn/SqlAccess.DLL 
Assembly.GetExecutingAssembly().Location 
Result : empty 
Assembly.GetExecutingAssembly().GetName().CodeBase 
Result : empty 
Directory.GetCurrentDirectory(); 
Result : C:\Windows\system32 
AppDomain.CurrentDomain.BaseDirectory; 
Result : C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Binn\ 
Environment.CurrentDirectory; 
Result : C:\Windows\system32 

誰もがSQL ServerがDLL関数を登録する方法を知っていますか?それはメモリゾーンに関数を保存し、dllファイルをもう読まないようなものです。

誰もがあまりにも解決策を持っている場合、あなたはSQL Serverでアセンブリを作成する場合)

答えて

2

DLLのバイナリコードは、SQL Serverにロードされます。あなたはsys.assembly_filesで見つけることができます。アセンブリを作成するために使用されるdllは、アセンブリ内で関数を実行するときには使用されません。

問題の考えられる解決策は、構成ファイルへのパスを含む.iniファイルを持つことです。 .iniファイルは、環境変数pathで見つけることができます。

+0

あなたはそうです。だから、私はDLLのディレクトリを調べることができません。最初の解決策は、sys.assembly_filesのdllの完全なパスです。しかし、私はそれが良い方法ではないと思う。だから、私は構成ファイルなしでSQL Serverをスローする私のdllパラメータに与えます。 – BaptX

関連する問題