C# 在dll和x27之间传递web引用对象;s

C# 在dll和x27之间传递web引用对象;s,c#,web-services,web-reference,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.

我有一个有两个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;
}
using B.com.test.services 
public DetailScreen(Task task)
{
    //some code
}
Dll B:

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;
}
using B.com.test.services 
public DetailScreen(Task task)
{
    //some code
}

问题在于,创建web引用意味着为所引用服务的每种类型创建代理类

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

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

有两种可能的方法。首先-使用方法创建自己的映射类,这些方法将
A.Task
转化为
B.Task
(或者反过来)

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


这样,就不会为类型
任务创建代理类型——相同的类将在服务器端和客户端使用。这样就不需要转换任何内容,您就可以传递引用。

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

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

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

有两种可能的方法。首先-使用方法创建自己的映射类,这些方法将
A.Task
转化为
B.Task
(或者反过来)

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


这样,就不会为类型
任务创建代理类型——相同的类将在服务器端和客户端使用。这样就不需要转换任何内容,您就可以传递引用。

而不是在B库中使用
A.com.test.services.Task
'B.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);
}

您可以使用B库中的
A.com.test.services.Task
来代替
A.com.test.services.Task
'B.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);
}

我们可以看到你使用的一些代码吗?任务对象看起来像什么?对任务对象的引用必须是相同的。我们可以看到你使用的一些代码吗?任务对象看起来像什么?对任务对象的引用必须是相同的。你用不到一分钟的时间打败了我,你很好地解释了代理类,我添加了映射代码。团队合作:p重用WCF代理生成器中引入的引用类型的可能性,在上述情况下省去了很多麻烦。你在不到一分钟的时间里打败了我,你很好地解释了代理类,我添加了映射代码。团队合作:p重用引用类型的可能性,介绍