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

C# 正在SQL Server 2005中加载CRL程序集:给定的程序集名称或代码库无效。(来自HRESULT的异常:0x80131047),c#,sql,sql-server-2005,clr,.net-assembly,C#,Sql,Sql Server 2005,Clr,.net Assembly,我已经编写了一个C#DLL,需要从存储过程调用它 在我所做的所有步骤中,我都遇到了错误,并设法解决了它们。但现在我已经厌倦了错误,我不得不求助于这里并提出要求。我解决不了这个问题。在将这个.DLL安装到SQL Server中时,我每迈出一小步,就要解决大量的错误 以下是程序的C代码(编译为类库以获取DLL): 它正在使用欧洲增值税检查Web服务()提供的另一个免费库,并使用它们的库()(我想这段代码既长又复杂,您可以阅读我的代码 好的。我在SQL Server Management Studio

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

在我所做的所有步骤中,我都遇到了错误,并设法解决了它们。但现在我已经厌倦了错误,我不得不求助于这里并提出要求。我解决不了这个问题。在将这个.DLL安装到SQL Server中时,我每迈出一小步,就要解决大量的错误

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

它正在使用欧洲增值税检查Web服务()提供的另一个免费库,并使用它们的库()(我想这段代码既长又复杂,您可以阅读我的代码

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

CREATE PROCEDURE VAT_CHECKER
@Naz_codi nvarchar(2),
@vatNum nvarchar(max)
AS EXTERNAL NAME WebServiceVatEuropaClass.[WebServiceVatEuropa.WebServiceVatEuropaClass].[check]
GO
然后在db中,我有:

  • 使用msn中的代码启用clr

    sp_configure 'show advanced options', 1;
    GO
    RECONFIGURE;
    GO
    sp_configure 'clr enabled', 1;
    GO
    RECONFIGURE;
    GO
    
  • 将db所有者更改为sa

  • 使用此代码注册程序集

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

    EXEC VAT_CHECKER 'IT','10050721009'
    
    我得到这个错误:

    Microsoft.NET Framework在尝试加载程序集id 65545时出错。服务器可能资源不足,或者 该程序集的权限\u SET=EXTERNAL\u ACCESS可能不受信任 或不安全。请再次运行查询,或查看文档以了解如何 解决程序集信任问题。有关此问题的详细信息,请参阅 错误:System.IO.FileLoadException:无法加载文件或程序集 'webservicevateuropa,版本=0.0.0.0,区域性=中性, PublicKeyToken=null'或其依赖项之一。给定的程序集 名称或代码基无效。(来自HRESULT的异常:0x80131047)

    System.IO.FileLoadException:
    在System.Reflection.Assembly.\u nLoad(AssemblyName文件名,字符串 代码库、证据汇编安全性、汇编位置提示、, stackcrawmark&stackMark,布尔throwOnFileNotFound,布尔值 用于自省)
    在System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, 证据集合安全性,堆栈爬网标记和堆栈标记,布尔值 用于自省)
    在System.Reflection.Assembly.InternalLoad(字符串assemblyString、证据assemblySecurity、StackScrawMark和stackMark,布尔值用于内省)
    在System.Reflection.Assembly.Load处(字符串assemblyString)


    它可能是什么?我找不到任何东西来修复它…

    错误消息基本上告诉了您所有的信息-因为您的程序集正在访问外部web服务,所以您必须将其配置为
    外部访问

    您不只是展示如何在SQL Server中创建程序集,而是基本上需要使用以下内容:

    CREATE ASSEMBLY assembly_name
    FROM ...(your assembly).....
    WITH PERMISSION_SET = { EXTERNAL_ACCESS }
    
    您是这样做的吗?如果不是:请使用
    EXTERNAL\u ACCESS
    权限集重试


    有关更多详细信息,请参见

    ,因此,我终于设法解决了这个问题(我简直不敢相信)

    以下是我所做的:

    -代码基本上与上面的相同

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

    -正如我所说的,在将此程序集部署到SQL Server实例的任务中,我每执行一步都会遇到一个错误。这次也一样。在远程桌面计算机上编译后,它又出现了一个关于XmlSerialization的错误

    注意:我需要XmlSerializer的具体原因是因为我使用的Web服务使用Xml和C#Xml对象来操作数据,因此程序中涉及Xml。我不知道在其他情况下是否需要XmlSerializer,但在这种特殊情况下,我需要XmlSerializer否则SQL server会给我公开的错误

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

    我通过改变编译设置来生成这个额外的dll来解决这个问题,如本文所示

    -这就结束了我在VisualStudio中必须做的事情

    现在开始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给了我完全误导性的安全/外部权限错误消息)将程序集权限设置为外部权限而不是不安全权限可能就足够了。我之所以这样说,是因为如果不是严格需要的话,您可能不希望允许不安全的权限,因为整个过程都是非常不安全的(如果我通过在internet上阅读详细的文档)即使使用非对称密钥,也有人可以替换您的程序集

    然后我创建了用于调用程序集的存储过程(与问题中的上述代码相同),这次我调用EXEC时,它成功了


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

    添加了我用来创建clr的内容(实际上我没有创建它,所有sql作业都由DBA完成)。它似乎已经设置为外部访问。当我第一次在Sql 2005中记录我自己关于添加CLR程序集的内容时,我已经阅读了大量与msdn相关的文章。因此,我所做的基本上是遵循这些指南。DBA告诉我,可能不安全的级别甚至比外部访问更高,因此,将其设置为不安全应该包括你知道这个特别的问题吗?同时我读了msdn的文章我把它创建为不安全的。引用msdn:UNSAFE-UNSAFE允许程序集不受限制地访问SQL Server内外的资源。代码执行
    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