2009-10-20 2 views
1

VB6 ActiveX exe 프로젝트에서 새로운 이벤트가 추가되면 이벤트 디스패치 인터페이스의 GUID를 보존 할 수있는 방법이 있습니까?VB6 이진 호환성 - 새로운 이벤트 추가

분명히 기존 이벤트를 변경하면 호환성이 깨집니다. 새 항목을 추가해도 VB6 IDE에서 경고를 표시하지 않습니다. 새로운 메소드를 추가 할 때 경고하지는 않지만 적어도 기존 메소드가 GUID를 유지한다는 점에서 놀랍지는 않습니다.

이벤트를 사용하면 나중에 새 이벤트가 추가 될 경우 기존 이벤트와의 호환성을 유지할 수 없습니다.

이것은 COM을 통해 통합 된 VB6 응용 프로그램에서는 문제가되지 않는 것 같습니다. 나는 VB 런타임이 GUID를 미리 알 필요가없이 레지스트리를 통해 이벤트를 픽업하는 것을 영리하게 생각한다고 가정한다.

다른 앱은 .Net (특히 C#)이며 이벤트 싱크를 구현하기 위해서는 손으로 인터페이스를 선언해야합니다. GUID를 상수로 유지하여 i/VB6 앱이 확장 될 때마다 VB6 앱에서 새로 구현 된 이벤트에 대해 알지도 모르고 신경을 쓰지도 못합니다. .NET 소스 코드를 변경하지 않고도 기존 이벤트를 계속 사용할 수 있기를 바랍니다.

내가 할 수있는 VB6 트릭이 있습니까?

답변

0

이벤트를 추가 할 때 호환성이 손상되지 않도록하는 방법을 찾지 못했습니다. 불행히도 이것은 처음부터 올바르게해야만하는 것들 중 하나입니다 (모든 새로운 이벤트, 매개 변수 등을 가져 오십시오). 그래서 호환성을 깨뜨릴 때, 나는 그 고통을 한 번 거쳐야합니다.

0

이벤트를 변경할 때 GUID 상수를 유지할 방법을 찾지 못했지만 .NET 응용 프로그램에서 VB6 어셈블리 만 사용하는 경우 각 VB6 DLL을 tlbimp 할 수 있습니까? 다시 작성한 다음 손으로 .NET에서 인터페이스를 작성하는 대신 해당 참조를 작성하십시오.

+0

아마도,하지만 내가 겪은 것은 VB6 앱을 수정할 수있는 방법인데, 이는 .Net 앱 (및 기존 VB6 앱과 통합 된 타사 앱)을 의미하지는 않습니다. 우리가/새로운 이벤트를 구현하기를 원하지 않는 한, 몇 가지)를 전혀 건드릴 필요가있다. –

+0

VB6 서비스 팩 7의 상태를 확인하십시오. –

2

한 번 정의 된 COM 인터페이스는 불변합니다. 그러나 COM에는 버전 관리 기능이있어 이전 인터페이스를 새 인터페이스와 호환되도록 설정할 수 있습니다.

비주얼 베이직 (Visual BASIC)은 장면의이면에서 com 인터페이스의 새로운 버전을 만듭니다. 버전 번호를 업데이트하고 새 방법을 추가하고 필요한 정보를 설정하여 새 인터페이스를 이전 인터페이스와 함께 자동으로 사용할 수있게하십시오.

이벤트가 자동으로 수행되지 않는 것으로 보입니다. Visual Studio OLE/COM Object View를 사용하고 GUID 변경 사항을 확인했습니다.

하이브리드 VB6/.NET에 대한 가능한 해결책은 약간의 고통이지만 변경을 할 때 모든 것을 명확하게 유지합니다. 먼저 OLE/COM 개체보기를 사용하여 VB6 개체의 IDL을 가져와야합니다. 그런 다음 MIDL 컴파일러를 사용하여 typelib을 생성합니다. 이제는 typelib을 참조로 사용하십시오.

VB6 이름과 충돌하므로 인터페이스의 이름을 변경해야합니다. 아이디어는 .NET과 VB6 모두 typelib을 참조하고 인터페이스를 구현한다는 것입니다. 인터페이스를 업데이트 할 때마다 IDL을 변경하고, typelib을 다시 컴파일하고, 둘 다에 대한 인터페이스를 구현하십시오.

지금이 소리가 좀 복잡해지면 WFT! 나는 너를 비난하지 않는다. 그러나 내 자신의 변환 프로젝트에서 나는 특정 상황에서 유용하다고 생각했지만 VB6의 것들은 여전히 ​​개발 중이다. 그러나 그것을 사용해야한다.NET

이제 단순화 솔루션은 두 구성 요소가 상호 운용되는 데 필요한 최소값을 확인하고 분리하는 것일 수 있습니다. 사건들과 몇 가지 유적지를 말해봐. 해당 인터페이스에 대한 IDL을 생성하십시오. 형식 라이브러리를 컴파일하고이를 참조로 사용하십시오. 나는 그것을 또한했다.

+0

아주 흥미로운 해결책입니다! – Ant

+0

이 방법으로 이벤트를 구현할 수 없기 때문에이 메소드가 다운되지 않습니까? http://msdn.microsoft.com/en-us/library/aa262327%28VS.60%29.aspx –