2011-01-20 4 views
1

.NET DLL을 호출하는 VB6에있는 기존 응용 프로그램에서 작업하고 있습니다. 하지만 VB6 앱에서 내 .NET 코드가 호출 된 것을 반영하지 않습니다. 내가는 .NET 응용 프로그램에서 하나의 공용 propertt을 추가 한하지만 난 그것을 액세스하려고 할 때, VB6 예외가 발생합니다 :CreateObject vb6

내 PostBuild 이벤트 코드 "개체가이 속성 또는 메서드를 지원하지 않습니다."

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe $(ProjectDir)bin\$(TargetName).dll /regfile:$(TargetName).reg 
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe $(ProjectDir)bin\$(TargetName).dll /tlb:$(TargetName).tlb 

레지스트리 CLSID가 변경되는 것을 볼 수 있습니다. 그러나 코드는 VB6 에서 호출 할 때

Set frmApp = CreateObject("AssemblyName.Class1") 

내가 다른 설정을 어떻게해야합니까

VB6 코드 (개체가이 속성 또는 메서드를 지원하지 않습니다)에 반영되지 않는 이유는 무엇입니까?

VB6에서 새 classid에 대한 참조를 설정하는 방법은 무엇입니까?

+1

전환하지만 코드가 VB6에서 전화 할 때 반영되지 않습니까? ". 개체를 인스턴스화하는 데 사용하는 코드를 게시하십시오. – mdm

+0

RegAsm 명령에/codebase를 추가 했습니까? –

답변

3

닷넷 클래스를 ProgId attribute으로 표시 할 수 있습니다. 이렇게하면 컴파일 할 때마다 clsid가 변경되지 않습니다.

clsid가 변경되지 않으면 클래스를 취소하고 다시 등록 할 필요가 없습니다.

다시 등록한 후에는 VB6에서 참조를 새 classid로 설정해야합니다. VB6는 clsid를 사용하여 구성 요소를 검색합니다.

의견 후
VB6은 오래 전에 사용되었습니다. 나는 "참조"가 정확한 용어인지 모른다. 그러나 오래된 도서관에서 depency를 제거해야합니다. 그리고 처음에했던 것처럼 새로운 것에 의존성을 추가하십시오.

+0

VB6에서 새 classid에 대한 참조를 설정하는 방법은 무엇입니까? – gauravghodnadikar

+0

@GvS @gauravghodnadikar "참조"는 올바른 용어입니다. VB6 IDE에서 Project-References 메뉴 명령을 사용하여 – MarkJ

+0

@ MarkJ, 감사합니다. 마치 VBA (Word 매크로)처럼 생각했습니다. – GvS

1

"반영되지 않음"은 매우입니다. 그러나 게시 된 것처럼이 regasm.exe 명령은 이 아니며 VB6 프로그램이 어셈블리를 찾을 수 있도록하기에 충분합니다.이 아닙니다. 클래스 객체를 생성하는 것에 대해 불평하지 않는다면 gacutil.exe를 사용했습니다. 그리고 GAC에는 DLL의 이전 복사본이 들어 있습니다. gacutil.exe/u를 사용하여 이전 복사본을 제거해야합니다.

regasm.exe 명령 줄을 수정하고/codebase 옵션을 추가하여 DLL을 찾는 대신 빌드 디렉터리에서 항상 DLL 복사본을 사용하도록합니다 GAC에서

+0

여전히 같은 오류가 발생합니다. 1) RegAsm.exe/regfile을 사용하여 .Net 코드를 빌드했습니다. 2) RegAsm.exe/tlb (코드베이스 스위치 사용 안함) 3) VBP와 동일한 새 폴더 복사 4) 양식이 새 변경 사항에 따라 변경되지 않고 시도 할 때 새로 생성 된 소품에 접근하면 오류가 발생합니다. 객체가이 속성 또는 메소드를 지원하지 않습니다. – gauravghodnadikar

+0

@ gauravghodnadikar Hans의 대답을주의 깊게 읽었습니까? VB6은 VBP 디렉토리 또는 다른 곳에서 DLL의 로컬 복사본을 호출하지 않으며 GAC에 등록해야합니다 (나중에 참고 참조). 따라서 GAC에 이전 사본이 있어야합니다. 'gacutil.exe/u'를 등록 해제하고 '/ codebase'로 등록해야합니다. (참고) 매니페스트를 사용하여 로컬 디렉토리에서 DLL을로드하도록 VB6을 설득 할 수 있습니다.하지만 조금 고급 버전입니다.이 기능을 먼저 사용하고 나중에 다시 사용하는 것이 좋습니다. – MarkJ

+0

완료 ... 내 DLL을 C : \ Program Files \ Microsoft Visual Studio \ VB98에 복사하여 GAC 또는 Codebase 스위치에 배포 할 필요가 없습니다. – gauravghodnadikar

0

은 ... 나는 단순히 C에 내 DLL을 복사 완료 : \ 프로그램 파일 \의 Microsoft Visual Studio \ VB98와 GAC에 배포 할 필요가 작동하지 않거나/코드베이스는 "가 무슨 뜻 이죠

+0

Kinda는 컴퓨터를 실행하는 모든 컴퓨터에 Visual Studio를 설치해야합니다. 암호. –

+0

/codebase은 친구입니다. –