c# - 在 SQL Server 2005 中加载 CRL 程序集 : The given assembly name or codebase was invalid.(HRESULT 异常:0x80131047)

标签 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);
        }
    }
}

它使用欧洲增值税检查网络服务( 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
    

然后当我启动时

EXEC VAT_CHECKER 'IT','10050721009'

我收到此错误:

An error occurred in the Microsoft .NET Framework while trying to load assembly id 65545. The server may be running out of resources, or the assembly may not be trusted with PERMISSION_SET = EXTERNAL_ACCESS or UNSAFE. Run the query again, or check documentation to see how to solve the assembly trust issues. For more information about this error: System.IO.FileLoadException: Could not load file or assembly 'webservicevateuropa, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The given assembly name or codebase was invalid. (Exception from HRESULT: 0x80131047)

System.IO.FileLoadException:
at System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
at System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
at System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
at System.Reflection.Assembly.Load(String assemblyString)

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

最佳答案

错误消息基本上告诉您所有信息 - 由于您的程序集正在伸出并访问外部 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了解更多详情

关于c# - 在 SQL Server 2005 中加载 CRL 程序集 : The given assembly name or codebase was invalid.(HRESULT 异常:0x80131047),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17791227/

相关文章:

c# - 在您的 app.config 中使用加密的 appSettings 元素有多安全?

c# - 拦截泛型类中的方法调用

C#如何改变DataTable中的数据?

c# - 解析动态数据

java - 从存储过程中检索 Java 对象

sql - 如何在 SQL Server 2005 中插入一组值?

MySQL 计算一列的唯一性,而其他列在 Group By 中具有单个值

sql-server-2005 - SQL Server 2005 SSIS 数据传输 SQL 到 Excel 损坏 Excel 文件

sql - T-SQL - 字符串连接

sql - 大表的问题(没有可用的主键)