在dll之间传递Web引用对象

时间:2012-08-17 07:18:45

标签: c# web-services web-reference

我有一个带有两个dll的项目(我将它们命名为A& B) 在第一个dll中,我想将web引用的对象传递给我的其他dll 这两个dll使用了来自对象的属性,因此我在我的dll中添加了对该服务的Web引用。

但是当我想传递这个对象时,我收到一个错误:

The best overloaded method match for 'method in dll B (B.com.test.services.Task)' has some invalid arguments.

所以我的dll A期望它是A.com.test.services.Task类型的对象,同时它获得类型为B.com.test.services.Task的对象。

我该如何解决这个问题?

一些代码:

Dll A:

using A.com.test.services
public string BuildDetail(Task task, bool TaskExecutionState, bool TaskComment) 
{
    DetailScreen detail = new DetailScreen(task);   //error is here.
    return detail.Layout;
}

Dll B:

using B.com.test.services 
public DetailScreen(Task task)
{
    //some code
}

2 个答案:

答案 0 :(得分:2)

问题是创建Web引用意味着为每种类型的引用服务创建代理类。

假设您拥有自己的dll,A.dll,并且您创建了一个类型为Task的服务的Web引用。在A内部,代理类型,我们称之为A.Task。类型TaskA.Task是两种不同的类型,服务器上存在Task,客户端上存在A.Task

然后,您有另一个DLL,B.dll,并再次添加一个Web引用。这次,将创建另一个代理类型,我们称之为B.Task。尽管A.TaskB.Task看起来很相似,但它们是两种不同的类型(很可能它们存在于两个不同的名称空间中)。

有两种可能的方法。首先 - 使用方法创建自己的映射类,这些方法将A.TaskB.Task从中取出(反之亦然)。

但是另一种方法涉及创建一个“共同语言” - 一个共享的DLL(让我们称之为Task.dll)你放置Task类。您可以在网络服务中的A.dllB.dll中随处引用DLL。每次创建Web引用时,都要确保选中“从引用的程序集重用类型”选项(在引用属性页面中)。

这样,将为类型Task创建无代理类型 - 将在服务器端和客户端使用相同的类。然后就没有必要转换任何内容了,你就可以传递引用。

答案 1 :(得分:1)

您可以在B库中使用A.com.test.services.Task而不是'B.com.test.services.TaskA.com.test.services.Task。因此,您应该在B中添加对A的引用。然后,在B库中使用B.com.test.services.Task的位置,将其替换为A.com.test.services.Task。这样,您的对象可以在库之间来回传递,因为类型是相同的。

或者在B中,如果属性与以下内容匹配,则可以将A.com.test.services.Task转换为B.com.test.services.Task

public string BuildDetail(A.com.test.services.Task task, bool TaskExecutionState, bool TaskComment) 
{
    DetailScreen detail = new DetailScreen(task); 
    return detail.Layout;
}

public string BuildDetail(B.com.test.services.Task task, bool TaskExecutionState, bool TaskComment) 
{
    //create a new Task of the A library
    A.com.test.services.Task tempTask = new A.com.test.services.Task();

    //fill the task with the properties of B
    tempTask.propOne = task.propOne;
    tempTask.propTwo = task.propTwo;

    //call the function which takes an A task and return that.
    return BuildDetail(tempTask, TaskExecutionState, TaskComment);
}