在C#中导入DLL时出现问题

液芯

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

基本上,它包含在一个庞大的图书馆中,该图书馆使用了欧洲共同体增值税检查服务(我认为该网址是增值税网络服务)

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

我所做的是启动Visual Studio 2010中新的C#类库,然后加入这个类被自动从web服务下载供自己使用,然后写了这个片断我在网络上找到。

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'(您是否缺少using指令或程序集引用?)

我试图建立,关闭,重新打开项目。试图将其放在Winforms中,依旧无济于事。我总是得到那个错误。

我究竟做错了什么?我该怎么解决?

还有一个问题:

这段代码到底在做什么?

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

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

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

我必须将此DLL包含在SQL Server中(我认为是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等SqlType。我尝试了一下,但遇到了大量的转换错误之类的东西。它只是不允许我在SqlTypes中声明这些对象,并且我无法计算出最后一个return语句以输出那些SqlType。

如有可能,任何人都可以举个例子吗?

谢谢你们。

汤米
  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或实体框架,等等。我实际上无法弄清您提供的这些存储过程的意图。

编辑:

尝试通过以下方式将结果传递到SQL Server SqlContext

[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
                         }; 
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章