在SQL Server 2005中加载CRL程序集:给定的程序集名称或代码库无效。 (HRESULT异常:0x80131047)

时间:2013-07-22 15:15:32

标签: c# sql sql-server-2005 clr .net-assembly

我编写了一个C#DLL,我需要从存储过程中调用它。

我通过我所做的所有步骤都遇到了错误,并设法解决了这些问题。但现在我已经厌倦了错误,我不得不求助于此。我无法解决这个问题。我将这个.DLL安装到SQL Server中所做的每一个小步骤,都有很多错误需要解决。

这是程序的C#代码(编译为类库以获取DLL):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Xml;
using System.IO;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

namespace WebServiceVatEuropa
{
    public class WebServiceVatEuropaClass
    {
        #region "Default Constructor"
        public WebServiceVatEuropaClass()
        {

        }
        #endregion

        [SqlProcedure]
        public static void check(string country, string vatNum)
        {
            bool valid;
            string name;
            string address;
            checkVatService vatchecker = new checkVatService();
            vatchecker.checkVat(ref country, ref vatNum, out valid, out name, out address);
        }
    }
}

使用欧洲大桶检查webservice(Link to webservice)提供的另一个免费库并使用他们的库(Library code)(这段代码很长很复杂,你可以读我的猜测。

好。我在SQL Server Management Studio中使用此代码创建存储过程(我在这里遇到很多问题,许多错误,但现在它可以工作):

CREATE PROCEDURE VAT_CHECKER
@Naz_codi nvarchar(2),
@vatNum nvarchar(max)
AS EXTERNAL NAME WebServiceVatEuropaClass.[WebServiceVatEuropa.WebServiceVatEuropaClass].[check]
GO

然后在数据库中我有:

  1. 使用msn

    中的代码启用clr
    sp_configure 'show advanced options', 1;
    GO
    RECONFIGURE;
    GO
    sp_configure 'clr enabled', 1;
    GO
    RECONFIGURE;
    GO
    
  2. 将数据库所有者更改为sa

  3. 使用此代码注册程序集

    CREATE ASSEMBLY [WebServiceVatEuropaClass] --AUTHORIZATION [mydb\administrator]
    FROM 'C:\Upload\WebServiceVatEuropa.dll'
    --WITH PERMISSION_SET = SAFE
    WITH PERMISSION_SET = UNSAFE
    --WITH PERMISSION_SET = EXTERNAL_ACCESS
    
  4. 然后当我启动时

    EXEC VAT_CHECKER 'IT','10050721009'
    

    我收到此错误:

      

    尝试加载程序集ID 65545时,Microsoft .NET Framework中发生错误。服务器可能资源不足,或者   PERMISSION_SET = EXTERNAL_ACCESS可能不信任程序集   或UNSAFE。再次运行查询,或检查文档以了解如何操作   解决装配信任问题。有关此内容的更多信息   错误:System.IO.FileLoadException:无法加载文件或程序集   'webservicevateuropa,版本= 0.0.0.0,文化=中立,   PublicKeyToken = null'或其依赖项之一。给定的程序集   名称或代码库无效。 (来自HRESULT的异常:0x80131047)

         

    System.IO.FileLoadException:
      在System.Reflection.Assembly._nLoad(AssemblyName fileName,String   codeBase,Evidence assemblySecurity,Assembly locationHint,   StackCrawlMark&安培; stackMark,Boolean throwOnFileNotFound,Boolean   forIntrospection)
      在System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef,   证据集合安全,StackCrawlMark& stackMark,布尔   forIntrospection)
      在System.Reflection.Assembly.InternalLoad(String assemblyString,Evidence assemblySecurity,StackCrawlMark& stackMark,Boolean forIntrospection)
      在System.Reflection.Assembly.Load(String assemblyString)

    它可能是什么?我找不到任何解决方法......

2 个答案:

答案 0 :(得分:1)

错误消息基本上告诉您所有内容 - 由于您的程序集已联系并访问外部Web服务,因此您必须将其配置为EXTERNAL_ACCESS

您没有展示如何在SQL Server中创建程序集 - 但基本上,您需要使用以下内容:

CREATE ASSEMBLY assembly_name
FROM ...(your assembly).....
WITH PERMISSION_SET = { EXTERNAL_ACCESS }
你是这样做的吗?如果不是:请使用EXTERNAL_ACCESS权限设置再次尝试!

有关详细信息,请参阅MSDN documentation on Code Access Security

答案 1 :(得分:1)

所以,最后,我设法解决了这个问题(我无法相信)。

这就是我的所作所为:

- 代码与上面大致相同。

- 我试图在远程桌面计算机上的SQL Server 2005上部署dll,但我正在使用Visual Studio 2010在本地编译它。可能这是一个问题,或者可能不是。但我切换到安装在远程桌面计算机上的Visual Studio 2008副本。我在一些网站上读到,Visual Studio中不同的目标体系结构编译设置可能会产生类似于我的问题。

- 正如我所说,在我将此程序集部署到SQL Server实例的任务中所做的每一步,我都遇到了错误。而这一次也没有什么不同。在远程桌面计算机上编译它之后,它给出了另一个关于XmlSerialization的错误。

注意:因为我需要 XmlSerializers的特殊原因是因为我正在使用一个使用Xml和C#Xml对象操作数据的Web服务,因此Xml参与了该程序。我不知道你是否需要XmlSerializers在其他情况下,但在这种特殊情况下我需要它,否则SQL服务器会给我一些开放的错误。

此处解释了此特定问题的解决方案:

Xml Serialization issues

通过更改文章中显示的编译设置来生成这个额外的dll,我解决了这个问题。

- 这结束了我在Visual Studio中必须做的事情。

现在它启动SQL部分:

  • 我必须为我自己的DLL和XmlSerialization创建一个程序集。

    CREATE ASSEMBLY [WebServiceVatEuropaClass] --AUTHORIZATION [mydb\administrator]
    FROM 'C:\Upload\WebServiceVatEuropa.dll'
    --WITH PERMISSION_SET = SAFE
    WITH PERMISSION_SET = UNSAFE
    --WITH PERMISSION_SET = EXTERNAL_ACCESS
    
    
    
    CREATE ASSEMBLY [WebServiceVatEuropaClassXmlSerializers] --AUTHORIZATION [mydb\administrator]
    FROM 'C:\Upload\WebServiceVatEuropa.XmlSerializers.dll'
    --WITH PERMISSION_SET = SAFE
    WITH PERMISSION_SET = UNSAFE
    --WITH PERMISSION_SET = EXTERNAL_ACCESS
    

注意:可能因为问题不是权限(尽管Sql server给了我完全误导的SAFE / EXTERNAL权限错误消息),将程序集权限设置为EXTERNAL而不是UNSAFE可能就足够了。我说这只是因为你可能不想在不严格需要的情况下允许UNSAFE许可,因为整个过程非常不安全(如果我通过互联网阅读记录得很好),即使使用非对称密钥,也有人可以更换你的程序集

然后我创建了Stored过程来调用(在问题中与上面相同的代码)程序集,这次当我调用EXEC时,它已经工作了!

希望这对遇到同样问题的其他人有用。