Как восстановить каталог сборки - PullRequest
1 голос
/ 15 февраля 2012

Для вызова веб-службы я создал библиотеку DLL в C # .NET 2.0.

После регистрации библиотеки DLL в SQL Server 2008 R2 я попытался в этой библиотеке DLL восстановить ее каталог вЧтобы загрузить файл конфигурации.

Проблема в том, что все методы, которые я нашел в Google, не работают, и это проблема, потому что я не могу загрузить файл.Я не хочу помещать некоторые «жесткие пути» в мой код, потому что он может меняться в зависимости от среды.

Существует способ регистрации моей DLL в SQL Server 2008:

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: \ webservices \ 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.

Если у кого-то тоже есть решение;)

1 Ответ

2 голосов
/ 16 февраля 2012

Когда вы создаете сборку в SQL Server, двоичный код DLL загружается в SQL Server.Вы можете найти его в sys.assembly_files.DLL, используемая для создания сборки, не используется при выполнении функций в сборке.

Возможным решением вашей проблемы может быть файл .ini, содержащий путь к файлу конфигурации.Просто убедитесь, что вы поместили файл .ini в место, где его можно найти через переменную окружения path.

...