Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Вызов CLR-функции с использованием внешней DLL дает ошибку  [new]
Leax
Member

Откуда: Киев
Сообщений: 438
Привет,

Понадобилось сделать SQL-функции для чтения данных из rar-архивов.
На серваке Windows Server 2008R2 (64 бит)

Скачал unrar.dll со страницы http://www.rarlab.com/rar_add.htm
Сделал на C# свою UnRarSQL.dll с CLR-функцией, вызывающую методы из unrar.dll (NET 3.5, target CPU = x86; при других параметрах SQL при регистрации сборки ругается что некорректный формат)

Регистрирую в SQL:

USE TEST
GO

ALTER DATABASE TEST
SET TRUSTWORTHY ON;
GO

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO 

--создаем сборку
declare @path varchar(max)
set @path = '\\test65\CLRProcedure\'

if object_id('dbo.uf_unRarGetFileList','FT') is not null
	drop function dbo.[uf_unRarGetFileList]

if exists(select top 1 1 from sys.assemblies WHERE [name]='UnRarSQL')
	drop assembly UnRarSQL
	
CREATE ASSEMBLY UnRarSQL
FROM @path+'UnRarSQL.dll' 
WITH permission_set = UNSAFE
GO

CREATE FUNCTION [dbo].[uf_unRarGetFileList](@filePath nvarchar(4000), @password nvarchar(50))
RETURNS  TABLE (
	fileName nvarchar(max)
	,isDirectory bit
	,fileTime datetime
	,fileCRC bigint
	,fileAttributes int
	,packedSize bigint
	,unpackedSize bigint
	,versionToUnpack int
) WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [UnRarSQL].[UnRarSQL.StoredProcedures].uf_unRarGetFileList
GO

Зарегистрировал сборку на сервере, создал CLR-процедуру. Все вроде OK.
select * from sys.assembly_modules 

показывает что моя функция есть.

Но при попытке вызова функции
select * from [dbo].[uf_unRarGetFileList]('\\sserv\TEST\org\Temp.rar','')

получаю ошибку:
SQL Error
Msg 10314, Level 16, State 11, Line 1
An error occurred in the Microsoft .NET Framework while trying to load assembly id 65574. The server may be running out of resources, or the assembly may not be trusted with PERMISSION_SET = EXTERNAL_ACCESS or UNSAFE. Run the query again, or check documentation to see how to solve the assembly trust issues. For more information about this error:
System.IO.FileLoadException: Could not load file or assembly 'unrarsql, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ac6eb2daaa68596d' or one of its dependencies. The given assembly name or codebase was invalid. (Exception from HRESULT: 0x80131047)
System.IO.FileLoadException:
at System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
at System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
at System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
at System.Reflection.Assembly.Load(String assemblyString)


Уже все перепробовал, ничего не получается.... Проблем с разрядностью ОС вроде быть не должно (на компе разработки WinXP SP3 32бит, а на серваке 64бит, как уже писал в начале)

Буду очень благодарен любым дельным советам.
21 авг 13, 19:51    [14738544]     Ответить | Цитировать Сообщить модератору
 Re: Вызов CLR-функции с использованием внешней DLL дает ошибку  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
TRUSTWORTHY для БД включено?
21 авг 13, 20:13    [14738587]     Ответить | Цитировать Сообщить модератору
 Re: Вызов CLR-функции с использованием внешней DLL дает ошибку  [new]
ziktuw
Member

Откуда:
Сообщений: 3552
Если sql-сервер - x64, то любая попытка вызвать из него 32-х битную dll обломится. Даже не пытайтесь.

Сообщение было отредактировано: 21 авг 13, 20:31
21 авг 13, 20:29    [14738638]     Ответить | Цитировать Сообщить модератору
 Re: Вызов CLR-функции с использованием внешней DLL дает ошибку  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
Глеб
Если sql-сервер - x64, то любая попытка вызвать из него 32-х битную dll обломится. Даже не пытайтесь.


если она COM то можно
22 авг 13, 01:33    [14739248]     Ответить | Цитировать Сообщить модератору
 Re: Вызов CLR-функции с использованием внешней DLL дает ошибку  [new]
Leax
Member

Откуда: Киев
Сообщений: 438
invm
TRUSTWORTHY для БД включено?

да, включено
Глеб
Если sql-сервер - x64, то любая попытка вызвать из него 32-х битную dll обломится. Даже не пытайтесь.

да, x64...
22 авг 13, 08:58    [14739436]     Ответить | Цитировать Сообщить модератору
 Re: Вызов CLR-функции с использованием внешней DLL дает ошибку  [new]
ziktuw
Member

Откуда:
Сообщений: 3552
Lepsik
Глеб
Если sql-сервер - x64, то любая попытка вызвать из него 32-х битную dll обломится. Даже не пытайтесь.


если она COM то можно


Вы ошибаетесь. Обычным образом это сделать невозможно. Можно путем "химии", заставив её активироваться в другом процессе. Например, зарегистрировав этот объект как COM+ приложение, чтобы эта DLL активировалась в отдельно выделенном процессе dllhost.

Но разговор об этом бесполезен, поскольку речь ТС не о COM-объекте.
22 авг 13, 09:14    [14739480]     Ответить | Цитировать Сообщить модератору
 Re: Вызов CLR-функции с использованием внешней DLL дает ошибку  [new]
Leax
Member

Откуда: Киев
Сообщений: 438
Решил проблему:
- скопировал на сервере в папку C:\windows\system32 файл unrar64.dll (64-разрядная версия dll-ки)
- в Visual Studio в свойствах проекта указал "Platform target: Any CPU"
22 авг 13, 11:54    [14740513]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить