2

我有一个 .Net 程序集(64 位环境),它具有 P/Invoke 方法来加载非托管程序集。我想将 .Net 程序集中可用的方法用于 SQL 存储过程。这样做的目的是记录 SQL 相关的异常和错误。

下面是 .Net 程序集中包含在 SQL 中的方法。MyLogger.Logger.LogInfo方法在MyLogger程序集中定义,该程序集内部具有 P/Invoke 方法来加载非托管程序集。

public class SQLLogger
{
    [Microsoft.SqlServer.Server.SqlFunction()]
    public static void LogInfoMessage(SqlString infoMessage)
    {            
        MyLogger.Logger.LogInfo(infoMessage.ToString());          
    }

我构建了一个 .Net 程序集并在 SQL Server 2008 R2 中运行以下查询。

 CREATE assembly SQLLogger from 'C:\tmp\SQLLogger.dll' WITH PERMISSION_SET = SAFE 

我也将引用的内容保存MyLogger.dll在同一个文件夹中,并且出现以下异常。

CREATE ASSEMBLY 失败,因为安全程序集“MyLogger”中的类型“MyLogger.Logger”具有 pinvokeimpl 方法。安全程序集中不允许使用 P/Invoke。

我尝试使用权限集无限制、外部访问值手动在 sql 中创建程序集,但创建失败。

在External Access Permission Set & Unrestricted Permission Set的手动操作过程中出现以下错误。

为 SqlAssembly 'SQLLogger' 创建失败。(Microsoft.SqlServer.Smo) 附加信息:

执行 Transact-SQL 语句或批处理时发生异常。(Microsoft.SqlServer.ConnectionInfo)

程序集“mylogger,版本=1.0.0.0,文化=中性,publickeytoken=b8f8bb225641c4a3。” 在 SQL 目录中找不到。(Microsoft SQL Server,错误:6503)

有一些相关的帖子,但我没有得到任何解决方案,

从 SQL Server 2008 调用非托管 C/C++ DLL 函数

http://social.msdn.microsoft.com/Forums/en-US/sqlnetfx/thread/4a032c4b-1402-4c53-b34e-8c8bd724f904

谢谢你的帮助!!!

4

2 回答 2

2

所以它抱怨它不能自动加载引用的程序集,如果你也尝试加载另一个程序集会发生什么,如下所示:

CREATE ASSEMBLY MyLogger FROM 'C:\tmp\MyLogger.dll' WITH PERMISSION_SET = UNSAFE

然后尝试您的参考程序集:

CREATE ASSEMBLY SQLLogger FROM 'C:\tmp\SQLLogger.dll' WITH PERMISSION_SET = UNSAFE
于 2013-03-26T10:59:48.730 回答
0

您是否尝试使用 PERMISSION_SET=UNSAFE?这是必需的,因此程序集可以使用非托管资源。

于 2013-03-25T12:46:01.807 回答