2014-06-12 3 views
1

저는 최근에 레거시 VB6 응용 프로그램을 .NET으로 이식하려고했습니다. 그러나 완전한 포트가 아니며 응용 프로그램 계층에만 초점을 맞추고 있습니다. VB6 COM 구성 요소를 계속 사용하고 있습니다.VB.NET에서 VB6에 사용자 지정 컬렉션 클래스를 전달할 수 있습니까?

지금까지 그렇게 좋았지 만 최근에 벽에 부딪 혔습니다.

.NET에서 VB6으로 사용자 지정 컬렉션을 전달해야합니다. 이것이 가능한가?

.NET 측에서 호출하는 COM 메서드는 일반 개체를 기다리는 중입니다. 그러나 응용 프로그램은 즉시 다음과 같이 불어납니다. InvalidCastException - 지정한 캐스트가 유효하지 않습니다.

VB6 컬렉션을 .NET으로 전달하는 방법에 대한 힌트를 찾았지만 그 반대가 아닙니다. .NET에서 몇 가지 컬렉션 유형을 상속/사용하려고 시도했지만 지금까지는 아무 소용이 없습니다. 어떤 도움을 주셔서 감사합니다.

+0

시도해주세요. http://stackoverflow.com/questions/6231995/accessing-net-collection-in-vb6? – MarkJ

+0

@ MarkJ 나는 그 질문을 보았고 그것은 중복으로 보이지 않는다. VB6가 VBA를보고 있다고 믿게하는 방법이 있습니다. 콜렉션과 저는 그것을 제 대답에 설명했습니다. C#에서도 작동합니다. – Markus

+0

질문의 이유는 다음과 같습니다. @RyanMac은 그가 말하는 VB6 구성 요소에 대해 바이너리 호환성 및 바이너리 자체를 보존하려고합니다. 6231995에 대한 질문과 대답은 호환성을 유지하려는 것이 아닙니다. – Markus

답변

1

.NET 컬렉션 클래스에서 구현 한 COM 인터페이스 선언에서 열거자를 반환하는 메서드의 DispId를 -4로 설정합니다. 그 메소드 "GetEnumerator"를 호출하십시오.

반면에 VB6에서 For Each를 지원하는 것뿐만 아니라 실제로 VBA.Collection 객체를 모의하려는 경우 VB.NET 클래스 라이브러리에서 VBA 유형 라이브러리에 대한 참조를 설정할 수 있습니다 (클래스 라이브러리를 만들고 있다고 가정하고 VB.NET 클래스에 _Collection을 구현합니다.

<Guid("A4C4671C-499F-101B-BB78-00AA00383CBB")> 
<ComDefaultInterface(GetType(_Collection))> 
<ComVisible(False)> 
Public Class VBACollection 
    Implements _Collection 
    . 
    . 
    . 
End Class 

그런 다음 _Collection 인터페이스를 구현하십시오. VB.NET이 인터페이스 이름의 밑줄을 좋아하지 않는다면, 그것을 이스케이프해야 할 수도 있습니다.

+0

아직 주사위가 없습니다. VB6에서 VBA.Collection 유형을 제공하기를 원하는 것처럼 보이지만 .NET에서 해당 클래스를 인스턴스화 할 수는 없다 (소비 할 수도 있음). – RyanMac

+0

아, 그래, VB6 메서드는 VBA.Collection을 기다리고 있습니까? 또는 사용자 지정 사용자 지정 컬렉션 형식을 수락하고 For Each를 사용하려고합니까? (두 가지 솔루션이 필요하기 때문입니다.) – Markus

+0

VBA.Collection 개체를 모방 한 솔루션을 추가했습니다. 내 원래의 참조 구현은 C#이고 VB.NET으로 번역되었으므로 100 %가 아니라면 사과드립니다. (개념은 동일합니다.) – Markus