2013-08-16 1 views
6

저는 COM으로 볼 수있는 간단한 .NET 프로젝트 (클래스 라이브러리)를 작성했습니다. 그것은 VB6와 함께 작동합니다!ClassInterfaceType.AutoDual을 사용하면 VB6에서도 정말 나쁜 생각입니까?

코드는 다음과 같습니다 :

어셈블리가 제대로 서명
[ComVisible(true)] 
[ClassInterface(ClassInterfaceType::AutoDual)] 
public ref class MyObject 
{ 
    // Some methods and values 
} 

(가 GAC에없는 경우 필요 없음) 및 (regasm MyProject.dll /tlb /codebase) 등록.

그런 다음 TLB 파일은 내 VB6 프로젝트에서 참조되며 모두 정상입니다! 내 수업과 그 안에있는 공개 방법에 액세스 할 수있었습니다.

인터넷에서 많은 사람들은 ClassInterfaceType::AutoDual을 사용하는 것이 버전을 사용하면 어셈블리를 사용하는 응용 프로그램을 손상시킬 수있는 잠재적 인 문제로 인해 좋지 않다고 말합니다.

하지만 제 경우에는 정말 문제입니까? 이 어셈블리는 VB6 프로젝트에서만 사용됩니다 (초기 바인딩에서).

새 릴리스가 나올 때마다 나는이 단계 (서명, 등록 등)를 수행합니다. 이 솔루션의 버전 관리 문제가 될 수 있습니까?

어쨌든, 나는 [GUID("...")] 속성을 쓸 수 있습니까?

GUID는 Visual Studio에서 자동으로 생성되므로 각 컴파일시 클래스가 동일한 GUID가 아닙니다. 맞아?

답변

11

AutoDual을 사용하지 않으면 VB6에서 초기 바인딩이 작동하지 않습니다. 또한 자동 완성 기능은 VB6 편집기에서 더 이상 작동하지 않으므로 런타임 오류를 유발하는 실수를 입력하는 위험이 높아집니다. VB6 프로그래머는이 문제에 익숙해 져서이를 고집합니다.

물론 위험합니다. COM 서버를 업데이트하고 [Guid]를 지정하고 업데이트하지 않은 경우 VB6 프로그램이 완전히 undiagnosable 오류가 발생하여 런타임에 중단 될 수있는 실질적인 위험이 있습니다. 또는 더 나쁜, 전혀 충돌하지 말고 완전히 잘못된 방법을 호출하십시오.

.NET에서 [Guid]를 자동 생성하도록 권장하는 경우 런타임시 하드 크래시가 발생하지 않지만 "ActiveX 구성 요소는 개체를 만들 수 없습니다"오류가 발생하는 것이 좋습니다. 좀 더 도움이되고 위험도가 적지 만 문제를 찾는 위치에 대해 사용자 나 사용자에게 거의 안내하지 않습니다.

ComInterfaceType.InterfaceIsIDispatch를 사용하는 경우 VB6 프로그래머는 런타임에 바인딩을 사용해야하며 GetObject()를 사용하여 개체를 만듭니다. [Guid]는 더 이상 중요하지 않으며 변경 사항이 너무 급진적이지 않으면 기존 VB6 코드가 COM 서버를 계속 사용할 수 있다는 확률이 높습니다. 예를 들어 한 가지 방법으로 추가 인수가 나온다면 여전히 폭탄이 터집니다. 거기에 대한 더 나은 런타임 오류가있을 것입니다. 그렇지 않으면 VB6 프로그래머가 당연히 의지하지 않은 방법의 논리가 변경 될 수 있습니다. 단점은 메서드 호출이 상당히 느려질 것이라는 점입니다.

+0

답장을 보내 주셔서 감사합니다. 명확히하기 위해 프로젝트에서 목표는 다음과 같습니다. 1) VB6에서 Intellisense 사용 2) 다음과 같은 객체 사용 : "Dim myobj As New MyObject". 그럼 내 해결책은 좋지, 안돼? –

+2

나는 이미 내 답변에서 자동 완성 기능이 IntelliSense와 동일하며 GetObject를 사용하고 싶지는 않습니다. 분명히 AutoDual 사용을 주장합니다. –

+0

많은 감사! 간단히 말해, 어셈블리를 제대로 제거하고 다시 설치하면 ('regasm'과 함께) 자동 생성 된 GUID 및 AutoDual을 사용하더라도 버전 관리에 아무런 문제가 없습니다. DispID는 어때? –

관련 문제