【问题标题】:Loading a CRL assembly in SQL Server 2005: The given assembly name or codebase was invalid. (Exception from HRESULT: 0x80131047)在 SQL Server 2005 中加载 CRL 程序集:给定的程序集名称或代码库无效。 (来自 HRESULT 的异常:0x80131047)
【发布时间】:2013-07-21 09:41:06
【问题描述】:

我编写了一个 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);
        }
    }
}

它使用欧洲增值税检查网络服务 (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. 将 db 所有者更改为 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
    

然后当我启动时

EXEC VAT_CHECKER 'IT','10050721009'

我收到此错误:

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

System.IO.FileLoadException:
在 System.Reflection.Assembly._nLoad(AssemblyName 文件名,字符串 代码库、证据组装安全、组装位置提示、 StackCrawlMark& stackMark,布尔 throwOnFileNotFound,布尔 forIntrospection)
在 System.Reflection.Assembly.InternalLoad(AssemblyName 组件引用, 证据组装Security, StackCrawlMark& stackMark, Boolean forIntrospection)
在 System.Reflection.Assembly.InternalLoad(String assemblyString, 证据 assemblySecurity, StackCrawlMark& stackMark, Boolean for Introspection)
在 System.Reflection.Assembly.Load(String assemblyString)

可能是什么?我找不到任何东西来解决它...

【问题讨论】:

  • 当您想在项目符号(或编号)列表中正确格式化代码 sn-ps 时,您需要将其缩进 8 个空格(不仅仅是 4 个)
  • 对于其他正在寻找答案的人,我发现了这个问题的组合,stackoverflow.com/q/2193720/192999 帮助了我。干杯。

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


【解决方案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了解更多详情

【讨论】:

  • 添加了我用来创建 clr 的内容(实际上我没有创建它,DBA 完成了所有的 sql 作业)。它似乎已经设置为外部访问。当我第一次记录自己在 Sql 2005 中添加 CLR 程序集时,我已经阅读了很多与 msdn 相关的文章。所以我所做的基本上是遵循他们的指南。 DBA 告诉我可能 UNSAFE 的级别甚至高于 EXTERNAL ACCESS,因此,将其置于 unsafe 应该包括 EXTERNAL ACCESS,但他不确定。您对这个特定问题有所了解吗?同时我阅读了msdn文章
  • 我将其创建为 UNSAFE。引用 MSDN:UNSAFE UNSAFE 允许程序集不受限制地访问 SQL Server 内部和外部的资源。从 UNSAFE 程序集中执行的代码也可以调用非托管代码。所以它也应该给 EXTERNAL_ACCESS...
【解决方案2】:

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

这就是我所做的:

-代码基本与上面相同。

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

-正如我所说,在将此程序集部署到 SQL Server 实例的任务中,我执行的每一步都出现错误。而这一次也不例外。我在远程桌面机器上编译后,又报XmlSerialization的错误。

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

这里解释了这个特定问题的解决方案:

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 许可,因为整个过程非常不安全(如果我通过在互联网上阅读很好地记录了自己),即使使用非对称密钥,也有人可以替换您的程序集

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

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

【讨论】:

    猜你喜欢
    • 2020-01-05
    • 2017-07-23
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多