0

我有一个带有两个 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
}
4

2 回答 2

2

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

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

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

有两种可能的方法。首先 - 创建您自己的映射类,并使用可以从中获取A.Task和制作B.Task的方法(以及可能的其他方式)。

但另一种方法涉及创建一种“通用语言”——一个共享的 DLL(我们称之为它Task.dll),您可以在其中放置您的Task类。您可以在任何地方引用 DLL,在您的 Web 服务中A.dll、在B.dll. 每次创建 Web 引用时,请确保选中“从引用的程序集中重用类型”选项(在引用属性页面)。

这样,将不会为该类型创建代理类型Task- 在服务器端和客户端将使用相同的类。这样就不需要转换任何东西,您将能够传递引用。

于 2012-08-17T07:38:12.473 回答
1

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

或者在 B 中,如果属性匹配,您可以转换A.com.test.services.TaskB.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);
}
于 2012-08-17T07:39:06.560 回答