我有一个有两个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
}
问题是创建 Web 引用意味着为引用服务的每种类型创建代理类。
假设您有 dll A.dll,并且您创建了对类型为 Task
的服务的 Web 引用。在 A 中,代理类型,我们称之为A.Task
将被创建。Task
和 A.Task
类型是两种不同的类型,Task
存在于服务器上,A.Task
存在于客户端上
然后,您有另一个 DLL B.dll并再次添加 Web 引用。这一次,将创建另一种代理类型,我们称之为 B.Task
.尽管A.Task
和B.Task
可能看起来很相似,但它们是两种不同的类型(很可能它们存在于两个不同的命名空间中)。
有两种可能的方法。首先 - 使用获取A.Task
并从中获取B.Task
的方法创建自己的映射类(可能相反)。
但另一种方法涉及创建一种"公共语言" - 一个共享 DLL(我们称之为 Task.dll
),您可以在其中放置Task
类。您可以在 Web 服务、A.dll
和 B.dll
中的任何位置引用 DLL。每次创建 Web 引用时,请确保选中"重用引用程序集中的类型"选项(在引用属性页)。
这样,就不会为类型 Task
创建代理类型 - 服务器端和客户端将使用相同的类。这样就不需要转换任何东西,您将能够传递引用。
A.com.test.services.Task
和'B.com.test.services.Task
,你可以在 B 库中使用 A.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);
}