2012-09-23 2 views
8

VB6로 작성된 다소 큰 프로젝트를 C#으로 변환하는 중입니다. 이동되는 프로젝트의 크기를 감안할 때 18 개월 동안 단계적으로 진행되고 있습니다. .NET 프로젝트에 VB6 ActiveX dll에 대한 참조를 추가하는 문제가 있습니다.Visual Studio에서 VB6 참조를 추가하면 형식 확인 중에 형식 라이브러리 가져 오기에서 오류가 발생했습니다.

이 단계를 정확하게 따르면 문제를 다시 생성 할 수 있습니다.

내가 볼 COM입니다 닷넷에서 인터페이스 작성했습니다 :

<ComVisible(True)> 
Public Interface ITestInterface 
    Property A As String 
    Function TestMethod() As String 
End Interface 

선택하여이 프로젝트 속성의 컴파일 탭에서 "COM interop에 등록", 당신은 TLB 파일을 얻을.

이 TLB를 참조하는 VB6 프로젝트와 노출 된 인터페이스를 구현하는 클래스를 만들었습니다.

Implements ITestInterface 

Private mA As String 

Public Property Get ITestInterface_A() As String 
    ITestInterface_A = mA 
End Property 

Public Property Let ITestInterface_A(ByVal value As String) 
    mA = value 
End Property 

Public Function ITestInterface_TestMethod() As String 
    ITestInterface_TestMethod = "From VB6" 
End Function 

나는 "원격 서버 파일"컴파일 할 때 다음 TLB가 자동으로 생성됩니다를 사용하는 VB6에서 프로젝트 속성의 구성 요소 탭을 설정합니다. 저는는 OLEView에서 그 TLB를보고는 (닷넷 프로젝트에 정의 된 인터페이스의 VB6에서 수행 구체적인 구현의 세부 사항에 추가하여) 다음을 참조 할 수 있습니다

// typelib filename: TestVB6Interface.dll 

[ 
    uuid(**EF005573-BFC7-436D-A382-F906CA09F94A**), 
    version(3.0) 
] 

// ... some other stuff 

// TLib :  // TLib : : {79EC733A-0267-4506-8D38-C4D4655E0755} 
importlib("SimpleDotNetLibrary.tlb"); 

지금, 나는 완전히 새로운를 만듭니다. 넷 프로젝트.

하는 COM 참조를 확인할 수 없습니다 "ef005573-bfc7-436d-a382-f906ca09f94a"버전 3.0 : 내가 VB6의 DLL에 대한 참조를 추가하는 경우, 나는 다음과 같은 오류가 발생합니다. 형식 라이브러리 가져 오기가 형식 확인 중에 오류가 발생했습니다. 클래스 멤버없이 가져 오기를 시도하십시오. 난 비주얼 스튜디오 명령 프롬프트를 실행하고 실행하면

그러나, 다음

tlbimp TestVB6Interface.tlb /out:TestVB6Interface.MyInterop.dll 

는 그럼 난 내 닷넷 솔루션에 참조로 그 DLL을 추가 할 수 있으며 완벽하게 잘 작동합니다.

내 질문. 명령 줄에서 tlbimp가 수행하는 작업은 내가 참조를 직접 추가 할 때 수행되지 않는 작업은 무엇입니까? Visual Studio의 메시지에서 "클래스 멤버없이 가져 오기 시도"라고 말하면 Visual Studio 내에서 정확히 어떻게합니까? 나는 tlbimp에서 그렇게하는 법을 안다.

나는 텍스트의 벽에 사과하지만 나는 내가 느낀 정보를 유지할 수있는 최상의 상황이 적절하다는 것을 설명하고 싶었다.

+0

혹시 이것을 알아 냈습니까? – JMK

+0

우리는 않았다 (다소). .Net 인터페이스를 구현하는 VB6 클래스는 "Attribute VB_Exposed = False"로 설정해야합니다. 즉, TLB에 없거나 VB6 DLL 외부에 노출되었지만 .Net 인터페이스를 필요로하는 COM에서 노출 된 메서드를 전달할 수 있습니다. (그리고 그것은 우리가 정말로 필요로하는 모든 것입니다). 이 증상은 해결되었지만 (오류는 사라졌습니다!),이 솔루션은 모든 사람들에게 적용되지 않을 수 있으므로 내 질문에 언급 된 근본 문제를 해결하지 못했습니다. –

+0

충분히 호기심을 묻는 질문에 답해 주셔서 감사합니다! – JMK

답변

2

Visual InterDev IDE는 명령 프롬프트에서 명령 줄 도구를 실행할 때 COM Interop 용 DLL을 등록 할 때 다른 경로를 사용합니다.

나는 Microsoft가 어디에서나 이것을 문서화했다고 의심한다. 그러나, 나의 년의 경험은 이것을 증명했다. 한때 .NET 2.0 Framework의 "regsvcs"명령이 실제로 무한 루프를 일으키는 상황에 직면했습니다. 당신이 구글에 있다면 당신은 아마도이 문제가있는 다른 사람들을 찾을 것입니다. VS IDE를 사용하여 .NET 서비스 구성 요소의 COM 등록을 수행하면 한 걸음 더 나아갈 수있었습니다. 그러나 필연적으로 오류가 발생했습니다. 이 오류는 무한 루프보다 한 발 앞선 것이 었습니다. 어느 쪽이든 그것은 VS IDE가 COM Interop 및 레지스트리 항목을 다룰 때 다른 코드 경로/비즈니스 논리를 사용한다는 것을 증명했습니다.

+0

있습니다. 경고가있는 경우 TLB를 가져 오지 않습니다. Tlbimp.exe가 콘솔에 표시하는 경고의 종류이며 양심적 인 경고이기 때문에 종종 무시할 수 있습니다. 주고받습니다. –

관련 문제