在c#中导入DLL的问题

时间:2013-07-15 08:49:16

标签: c# dll

我很难将C#Dll导入另一个简单的测试应用程序(控制台,winform,你的名字)。

基本上它包含一个庞大的图书馆,它使用欧洲社区增值税检查服务(我相信这是Vat webservice

该服务使您下载库,然后代码的实现由您决定。

我所做的是在Visual Studio 2010中启动一个新的C#类库,然后添加从Web服务自动下载的this class供您自己使用,然后编写我在网上找到的这个代码片段。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Xml;
using System.IO;


namespace EuroVAT
{
    public class EuroVAT
    {
        public static Array 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);

            return new object[] {country,
                                 vatNum,
                                 valid,
                                 name,
                                 address
                                 };
        }
    }
}

好吧,当我创建一个新的控制台应用程序时,然后添加一个引用(右键单击项目名称,添加引用,浏览到dll)到我从类库项目编译的DLL,其中包括我链接/引用的2个类在这里。

这是我尝试使用我的dll的一些代码:

using EuroVAT;

namespace DLLTEST
{
    class Program
    {
        static void Main(string[] args)
        {

            EuroVat test = new EuroVat();


        }
    }
}

基本上我无法从程序中调用它们。当我尝试调用EuroVAT对象时,我得到的只是

  

错误1找不到类型或命名空间名称'EuroVAT'(是   你错过了使用指令或程序集引用?)

我试图构建,关闭,重新打开项目。试图把它放在Winforms等等无济于事。 我总是得到那个错误。

我做错了什么? 我该怎么做才能解决它?

还有一个问题:

这段代码到底在做什么?

    return new object[] {country,
                         vatNum,
                         valid,
                         name,
                         address
                         };

这就像返回一个对象数组? 因为当我运行程序时,所有输出都被抛出所有输出。通常我必须通过某种循环循环输出...

最后一个问题,如果有人可以提供帮助:

我必须将这个DLL包含在SQL服务器中(我认为是2008)

我已经阅读过关于这个主题的内容并发现,为了从C#dll向SQL Server传递值,你必须包含各种库并将方法声明为SqlProcedures,还要将值作为SqlTypes传递/检索(SqlInt32,SqlString等)等)。

以下是我提出的建议:

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
{
    class Program
    {
        [SqlProcedure]
        public static Array 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);

            return new object[] {country,
                                 vatNum,
                                 valid,
                                 name,
                                 address
                                 };
        }
    }
}

我希望这是正确的。 我缺少的是如何将所有这些对象转换为SqlInt32,SqlString等SqlTypes。我试过,但我有很多转换错误和类似的东西。它只是不允许我将这些对象声明为SqlTypes并且我无法解决最后一个返回语句以输出那些SqlTypes。

如果有可能,任何人都可以展示一个例子吗?

谢谢大家。

1 个答案:

答案 0 :(得分:2)

  1. 您的班级被声明为EuroVAT。而初始化类型EuroVat的对象。检查寄存器 另一件事是,尝试给你的命名空间和类别命名

  2. 此:

    return new object[] {country,
                         vatNum,
                         valid,
                         name,
                         address
    };
    

    创建一个object类型的数组,并使用(object)country(object)vatNum(object)valid等填充

  3. 如果我确定您希望您的库与SQL Server进行交互,那么问题在于此数组。这些SQL类型(如SqlInt32SqlStringSqlBinary等等确实具有相应类型的隐式转换运算符,例如intstring。但由于数组包含object个实例,因此无法应用隐式转换。这是一方面。另一方面,SQL Server得到object[]的结果,它不能只处理它。它不知道如何。我认为您应该考虑使用数据访问框架来处理数据库,例如普通的ADO.NET或实体框架等等。我实际上无法用你提供的这些存储过程弄清楚你的意图。

  4. 修改

    尝试通过SqlContext将结果传递给SQL Server,如下所示:

    [SqlProcedure]  
    public static void UserService(string country, stringvatNum)    
    {       
        object[] serverResponse = CheckService(country, vatNum);
    
        // Variables.       
        SqlMetaData column1Info;        
        SqlDataRecord record;
    
        // Create the column metadata.      
        column1Info = new
        SqlMetaData("Column1", SqlDbType.Variant);      
    
        // Create a new record with the column metadata.       
        record = new SqlDataRecord(new SqlMetaData[]{column1Info});
    
         // Mark the begining of the result-set.
         SqlContext.Pipe.SendResultsStart(record);
    
         foreach (var o in serverResponse)      
         {
             record.SetValue(0, o);
             SqlContext.Pipe.SendResultsRow(record);        
         }      
    
         // Mark the end of  the result-set.        
         SqlContext.Pipe.SendResultsEnd();  
    }
    
    public static object[] CheckService(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);
    
         return new object[] {country,
                              vatNum,
                              valid,
                              name,
                              address
                             }; 
        }
    }