0

2つのdllを持つプロジェクトがあります(AとBという名前を付けます)。
最初のdllで、Web参照のオブジェクトを他のdllに渡したいと思います。
2つの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。タイプTaskA.Taskは2つの異なるタイプでTaskあり、サーバー上にA.Task存在し、クライアント上に存在します

次に、別のDLLであるB.dllがあり、もう一度Web参照を追加します。今回は、さらに別のプロキシタイプが作成されます。それを呼び出しましょうB.Task。そしてA.TaskB.Taskおそらく似ているように見えますが、それらは2つの異なるタイプです(ほとんどの場合、2つの異なる名前空間に存在します)。

2つの可能なアプローチがあります。A.Task最初に-それを取得して作成するメソッドを使用して独自のマッピングクラスを作成しますB.Task(場合によってはその逆)。

しかし、もう1つのアプローチは、「共通言語」、つまりクラスTask.dllを配置する共有DLL(これを呼びましょう)を作成することです。Taskどこでも、Webサービス内、内外でDLLを参照しA.dllますB.dll。Web参照を作成するたびに、[参照されたアセンブリからタイプを再利用する]オプションがオンになっていることを確認してください(参照プロパティページで)。

このように、タイプに対して作成されたプロキシタイプはありませんTask。同じクラスがサーバー側とクライアント側で使用されます。そうすれば、何も変換する必要がなくなり、参照を渡すことができるようになります。

于 2012-08-17T07:38:12.473 に答える
1

A.com.test.services.Task持っている代わりに、Bライブラリで'B.com.test.services.Task使用できます。A.com.test.services.Taskしたがって、BにAへの参照を追加する必要があります。次に、B.com.test.services.TaskBライブラリでを使用した場合は、それを。に置き換えます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);
}
于 2012-08-17T07:39:06.560 に答える