我很难将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。
如果有可能,任何人都可以展示一个例子吗?
谢谢大家。
答案 0 :(得分:2)
您的班级被声明为EuroVAT
。而初始化类型EuroVat
的对象。检查寄存器
另一件事是,尝试给你的命名空间和类别命名
此:
return new object[] {country,
vatNum,
valid,
name,
address
};
创建一个object
类型的数组,并使用(object)country
,(object)vatNum
,(object)valid
等填充
如果我确定您希望您的库与SQL Server进行交互,那么问题在于此数组。这些SQL类型(如SqlInt32
,SqlString
,SqlBinary
等等确实具有相应类型的隐式转换运算符,例如int
,string
。但由于数组包含object
个实例,因此无法应用隐式转换。这是一方面。另一方面,SQL Server得到object[]
的结果,它不能只处理它。它不知道如何。我认为您应该考虑使用数据访问框架来处理数据库,例如普通的ADO.NET或实体框架等等。我实际上无法用你提供的这些存储过程弄清楚你的意图。
修改强>
尝试通过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
};
}
}