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에서 그렇게하는 법을 안다.
나는 텍스트의 벽에 사과하지만 나는 내가 느낀 정보를 유지할 수있는 최상의 상황이 적절하다는 것을 설명하고 싶었다.
혹시 이것을 알아 냈습니까? – JMK
우리는 않았다 (다소). .Net 인터페이스를 구현하는 VB6 클래스는 "Attribute VB_Exposed = False"로 설정해야합니다. 즉, TLB에 없거나 VB6 DLL 외부에 노출되었지만 .Net 인터페이스를 필요로하는 COM에서 노출 된 메서드를 전달할 수 있습니다. (그리고 그것은 우리가 정말로 필요로하는 모든 것입니다). 이 증상은 해결되었지만 (오류는 사라졌습니다!),이 솔루션은 모든 사람들에게 적용되지 않을 수 있으므로 내 질문에 언급 된 근본 문제를 해결하지 못했습니다. –
충분히 호기심을 묻는 질문에 답해 주셔서 감사합니다! – JMK