我有一个 .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
谢谢你的帮助!!!