2011-08-22 4 views
0

Visual Studio 2008 변환 마법사를 사용하여 VB.Net에 VB6 코드를 이식했습니다. 포팅 된 코드가 올바르게 컴파일됩니다.VB 6 코드에서 관리 DLL을 호출 할 때의 문제

프로젝트 속성에 COM interop에 등록하려면 컴파일러 옵션을 선택해야합니다. 프로젝트를 빌드 할 때 DLL 및 TLB 파일을 얻습니다. 내가

gacutil /i myLib.DLL 

이제 사용하여 조립, DLL을 소모 된 VB 코드를 GACed 한 그 후 다음 명령

regasm myLib.DLL /tlb:myLib.tlb 

를 사용하여 어셈블리를 등록

...

Dim myObject 
    Set myObject= CreateObject("myLib.MyObject") 

. 오류가 발생했습니다.

런타임 오류 429, ActiveX componenet cant create object.

제대로 작동하려면 어떻게해야합니까? 그것을 확인하는

답변

1

것은 과거에 날을 잡 았있다 : -

의 .NET 측에 생성자에서 오류가 발생합니다 (이 처리 여부) 및 사용 VB6에서 개체를 만드는 경우

Dim myObject 
Set myObject = New myLib.MyObject 

최소한 오류가 남자에 발생 된 것을 볼 수있는 그런 방법 : CreateObject, 당신은 당신이 당신의 관리 프로젝트에 대한 참조를 추가하고 사용하는 것이 더 낫다 개발 중에 Runtime Error 429, ActiveX componenet cant create object.

받을 고령자.

+0

이 문제를 테스트하기 위해 더미 객관적인 테스트를 만들었습니다. procmon을 사용하여 발견 한 한 가지 차이점은 더미 프로젝트의 경우 런타임에서 HKCR \ MyDummyLib.MyObject 아래 항목을 찾습니다. 그러나 그것은 내 라이브러리에서 찾을 수 없습니다. 어떤 생각? –

1
  1. 기본 사항부터 시작하여 VB6에 노출시키려는 개체를 ComVisible로 설정 했습니까? 올바르게 호출하면 Visual Studio 2008의 기본값 인 ComVisible (false)이 어셈블리 수준에서 사용됩니다. 이전 버전의 Visual Studio 버전에서는 True로 기본 설정되어있었습니다.

수정 # 1 :

  1. 당신이 중첩 네임 스페이스 또는 복잡한 어셈블리 이름을 사용하고 있습니까? 어셈블리 및 네임 스페이스 이름에 mycompany.myproduct.subcomponent 스타일 명명 규칙을 사용하면 exporter 유형이 엉망임을 발견했습니다. 네임 스페이스를 사용하여 VB6에서 필요한 프로그래밍 ID의 왼쪽을 만듭니다.

  2. RegAsm을 실행할 때 어떤 메시지가 출력됩니까? 등록 할 수있는 유형을 찾을 수없는 경우 일반적으로 알려줍니다.

  3. TypeLib을 검사하여보고 싶은 유형이 있는지 확인하십시오. VB6에서 직접 tlb를 참조하고 F2를 눌러 TypeLib를 볼 수 있습니다. Visual Studio 6과 함께 제공되는 OLE보기를 사용할 수 있습니다.

  4. 구성 요소를 등록 할 때/codebase 옵션을 사용하여 다른 방식으로 동작 해 보았습니까?나는 거의 항상 코드베이스 등록을 사용하는데, 이는 일반 COM 등록이 어떻게 작동하는지와 비슷하기 때문입니다.

+0

ComVisible은 어셈블리 레벨에서 true입니다. –

+0

왜 1에서 다시 번호 매기기를 다시 시작했는지 모르겠지만 몇 가지 제안을 추가했습니다. – tcarvin

관련 문제