2012-08-17 62 views
0

我有一個項目有兩個dll(我將它們命名爲A & B)。
在第一個DLL中,我想將Web引用的對象傳遞給我的其他DLL。
這兩個DLL的對象使用屬性,所以我已經在我的DLL中添加了對Web服務的Web引用。在dll之間傳遞Web引用對象

但是,當我想通過這個對象,我得到一個錯誤:

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

所以我的DLL中的一個希望它是A.com.test.services.Task類型的對象,而它得到B.com.test.services.Task類型的對象。

我該如何解決這個問題?

某些代碼:

DLL中的一個:

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 
} 
+0

我們可以看到,使用一些代碼? – SynerCoder 2012-08-17 07:20:34

+0

只是添加了一些代碼。 – 2012-08-17 07:30:03

+0

任務對象的外觀如何? – 2012-08-17 07:35:54

回答

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.Task並使B.Task不在其中的方法創建自己的映射類(以及可能的其他方法)。

但另一種方法涉及創建一個「共同語言」 - 一個共享的DLL(我們稱之爲Task.dll),你把你的Task類。您可以在任何地方,在您的web服務中,在A.dllB.dll中引用該DLL。每次創建Web引用時,都要確保選中「從引用程序集中重用類型」選項(在引用屬性頁中)。

這樣,將會有沒有代理類型創建類型Task - 將在服務器端和客戶端使用相同的類。那麼將不需要轉換任何東西,你將能夠通過引用。

+0

你在一分鐘之內毆打我,你解釋了代理類好,我添加了映射代碼。團隊合作:p – SynerCoder 2012-08-17 07:42:41

+0

重複使用WCF代理生成器中引入的引用類型的可能性在上述情況下可以節省許多麻煩。 – 2012-08-17 07:46:46

1

您可以在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); 
} 
+0

我已經在A中引用了B,所以我可以從B中調用方法。因此,當我從B添加引用到A時,出現錯誤'無法添加對A的引用。添加這個項目作爲參考會導致循環依賴。' 我會嘗試第二種解決方案。感謝大家 :) – 2012-08-17 07:48:43