2009-04-19 5 views
0

우리는 큰 vb6 응용 프로그램을 가지고 있으며, 변경/수정해야 할 부분이 있으므로 .net을 사용하여 섹션을 Framework 2.0을 대상으로 이동합니다. 우리는 많은 수의 클래스를 .net dll로 옮겼으며 com에 제대로 노출되도록 설정되었습니다..Net COM DLL이 vb6에서 appdomains를 통해 작동하지 않습니다.

다음과 같은 문제가 있습니다. MainAppVB6.exe는 DOTNET_COM.ComClass를 인스턴스화합니다. 그것은이 차이를 appdomain을 통해 전달하는 dll의 메소드로 전달합니다. 이것은 vb6로 작성된 COM 개체에 전혀 문제가되지 않습니다.

.net appdomain 경계를 확인하고 개체가 serializable 또는 marshalbyref가되기를 원합니다. vb6으로 되돌아 오는 데이터를 변경하려면 .net 부분이 필요하므로 직렬화가 작동하지 않습니다. Inherits MarshalByRefObject 클래스를 표시하면 "이 원격 프록시에는 서버에 등록 된 서버 채널이 없거나 응용 프로그램에 서버와 통신하기에 적합한 클라이언트 채널이 없음을 의미하는 채널 싱크가 없습니다."라는 메시지가 표시됩니다.

채널이 없습니다. 같은 dll에서 appdomain을 건너 뜁니다. NET에서 개체를 COM으로 처리하지 않고있는 것으로 보입니다.

marshalbyref 및 serializable을 모두 제거하면 com 개체가 vb6에 의해 인스턴스화되는 경우에만 작동합니다. appdomain의 .net 기능이 개체를 만들고 vb6에 다시 전달되도록 할당하면 vb6에서 자동화 오류가 발생합니다.

매우 추한 kludge는 새로운 appdomain에서 객체를 직렬화하고 xml을 되돌려 보내고 vb6을 deserialize하도록합니다.하지만 그것은 우스꽝스럽게 보입니다.

누구든지 아이디어가 있습니까?

감사합니다.

세스

답변

0

당신은 당신의 첫번째 .NET 방법에 COM 클래스의 해당 뮤 테이터 방법에 대리자를 만드는 응용 프로그램 도메인 경계를 넘어 그 대리자를 통과, 두 번째에서 COM 개체를 돌연변이 그 대리자를 사용할 수 있습니다. NET 메서드를 호출 한 다음 변형 된 개체를 VB6에 반환합니다. Marshal Class의 메소드가 유용 할 수 있습니다. :)

코멘트에서 편집 : 첫 번째 .net 호출에서 .net 복사본을 작성하고, 새 객체를 전달하는 모든 .net 호출에 전달한 다음 com 객체를 수정하는 방법은 무엇입니까? 뒤로. vb6의 비 직렬화보다 쉬울 수도 있습니다.

+0

이 < ====> 로그인하지만, 별도의 응용 프로그램 도메인의 코드는 수십 개의 속성을 수정할 수있다 컬렉션에 새 객체를 추가 할 수 있습니다. 데이터를 파싱하고 com 개체에이 결과를 채우고 다시 vb6으로 전달합니다. 난 그냥 직렬화를 통과하는 데 기울고 있어요 ... –

0

중간 어셈블러 외관을 만들어야합니다. 그런 다음 응용 프로그램 Facade에서 AppDomain을 만듭니다. 그러면 dll vb6이있는 응용 프로그램의 파이프 라인 관리 책임을지게됩니다.

VB < ===> 외관 (AppDomain에) 몇 가지 속성을 위해 일 것 dll을 VB6

관련 문제