2012-08-17 3 views
0

두 개의 dll이있는 프로젝트가 있습니다 (AB라고합니다).
첫 번째 dll에서 다른 DLL에 웹 참조의 개체를 전달하고 싶습니다.
두 DLL의 개체에서 속성을 사용하므로 두 DLL에서 모두 웹 참조를 서비스에 추가했습니다. 나는이 물체를 통과 할 때dll의 사이에 웹 참조 개체 전달

는하지만 오류가 발생합니다 :

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

그래서 내 DLL A가이 유형 B.com.test.services.Task의 개체를 가져옵니다하면서 유형 A.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 
} 
+0

우리가 사용하는 코드를 볼 수 있을까요? – SynerCoder

+0

에 일부 코드가 추가되었습니다. –

+0

작업 개체는 어떻게 생겼습니까? –

답변

2

문제 웹 참조를 생성하는 프록시 클래스를 위해 생성되는 수단이다 참조 된 서비스의 각 유형.

dll, A.dll이 있고 유형이 Task 인 서비스에 대한 웹 참조를 만들었다 고 가정 해보십시오. A 내부에서 프록시 유형은 A.Task으로 만들어 보겠습니다. 유형 TaskA.TaskTask은 다른 DLL, B.DLL을 다시 한 번 당신이 웹 참조를 추가, A.Task 다음 클라이언트

에 존재하는 서버에 존재하는 두 개의 서로 다른 유형입니다. 이번에는 또 다른 프록시 유형이 생성 될 것이므로 B.Task이라고 부르 자. A.TaskB.Task이 비슷하게 보일지라도 두 종류가 있습니다 (대부분 두 개의 다른 네임 스페이스에 존재합니다).

두 가지 접근 방법이 있습니다. 먼저 - A.Task을 취하는 메소드로 자신의 매핑 클래스를 만들고 B.Task을 만듭니다 (가능하면 다른 방법으로).

그러나 다른 접근 방식은 Task 클래스를 넣는 "공용 언어"- 공유 DLL (Task.dll)을 만드는 것입니다. 웹 서비스의 모든 곳의 DLL을 A.dllB.dll으로 참조하십시오. 웹 참조를 만들 때마다 참조 된 어셈블리에서 유형 재사용 옵션이 선택되었는지 확인합니다 (참조 속성 페이지에서).

프록시 유형 이 유형이 Task 인 경우 생성됩니다. 동일한 클래스가 서버 측과 클라이언트 측에서 사용될 것입니다. 아무 것도 변환 할 필요가 없으며 참조를 전달할 수 있습니다.

+0

당신은 잠시 잠시 나를 깨웠다. 프록시 클래스에 대해 설명하고 매핑 코드를 추가했다. Teamwork : p – SynerCoder

+0

WCF 프록시 생성기에서 소개 된 참조 된 유형을 다시 사용할 수 있으므로 위와 같은 상황에서 많은 골칫거리를 줄일 수 있습니다. –

1

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에 당신은 B.com.test.services.TaskA.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

B에서 메소드를 호출 할 수 있도록 이미 A에서 B로 참조가 있습니다. 따라서 B에서 A로 참조를 추가 할 때 'A에 대한 참조를 추가 할 수 없습니다.'오류가 발생합니다. 이 프로젝트를 참조로 추가하면 순환 종속성이 발생합니다. ' 두 번째 해결 방법을 시도해 보겠습니다. 모두에게 감사합니다 :) –