2011-05-12 2 views
1

을 인터페이스/GUID/etc가 다른 언어로 작성된 최신 코드로 바꿀 수 있습니까?초기 바인딩 모듈

Legacy VB6 app replacement

을하지만 난 본론 것이라고 생각 :

나는 사촌 포스트에 설명 된대로이 작업을 수행하려합니다.

감사합니다.

+0

COM을 사용하여 가능할 수도 있습니다. 그것은 매우 재미있는 루트가 아닙니다. COM interop에 대해 .NET을 노출 할 수는 있지만 이것이 잠재적 솔루션 일지는 확실하지 않습니다. –

+0

그게 내가 대체하려고하는 모듈이 COM 인 길입니다. 하지만 난 그냥 작동하지 않을 수 있습니다 난 그냥 계속 모든 ID와 전화가 심지어는 자동화 오류를 받고 계속 줄을 나타납니다. –

+0

@Joh H 불안정한 레지스트리 설정이나 기타 일반적인 오류와 같은 대체 COM 개체를로드하는 중 오류가 발생할 수 있습니까? 즉, PowerShell 또는 새 프로젝트와 같은 새로운 컨텍스트에서 대체를로드 할 수 있습니까? (BTW, 나는 이것이 COM CLSID "보장"을 여러 방면으로 위반한다고 생각합니다.) –

답변

1

Dynamic은 VB6 (또는 다른 것)에 있었지만 현재 VB.net (또는 C#)이되고 싶은 COM 구성 요소를 참조하는 VB6 응용 프로그램에 대한 이야기이므로이 경우 도움이되지 않습니다.

그렇지만 그렇게 할 수 있어야합니다.

바꾸려는 COM DLL에 대한 MIDL을 생성하려면 OLEView (또는 비슷한 것)를 사용해야합니다. 그러면 해당 DLL에 정의 된 모든 클래스 및 인터페이스에 대한 특정 GUID가 제공됩니다.

그런 다음 모든 .NET 클래스에 대해 모든 단일 GUID를 지정하여 .net 버전의 DLL을 코딩해야합니다. 당신은 그물에 대한 문서를보고 싶을 것이다

속성 :

대해 ComVisible 가이 드 InterfaceType

그리고 아마도 몇 가지 더

. 이 attrs를 사용하면 특정 GUID를 사용하여 dll에서 어떤 개체와 인터페이스를 사용할 지 명시 할 수 있습니다.

기본적으로 두 DLL (이전 버전과 새로운 버전)에 대한 Typelibs를 생성하면 동일한 tlbs로 끝납니다. 그렇지 않은 경우 새 항목은 이전 항목과 호환되는 초기 바인딩 된 참조가 아닙니다.

+0

고맙습니다, 내가 취한 접근 방식을 확인했습니다. 그러나 얼마나 완벽하게 정렬해야합니까? 예를 들어, 새 코드의 IDL coclass 참조는 모두 _Object에 대한 인터페이스를 포함하지만 (분명히) VB6은 그렇지 않습니다. 올바른 인터페이스는 [default] interface _BIBranchDetails와 같습니다. 완벽한 방법도 완벽합니까?예를 들어, orignal IDL에 내가 사용하지 않는 호출이 포함되어 있다면; 그들은 여전히 ​​일치해야합니까? 또한 VB DataSet에서 'RecordSet'개체를 사용하는 'SetData'에 대한 호출이 있습니다. 일치시켜야합니까? 또는 빈 정의를 정의 할 수 있습니까? –

+0

VB6 앱에서 클래스 나 인터페이스를 참조하지 않으면이 클래스를 포함 할 필요가 없으며 문제없이 다른 클래스와 인터페이스를 다른 지침과 함께 포함시킬 수 있습니다. 그래서, 기본적으로 당신 말이 맞습니다. 호스트 프로그램에서 참조하는 GUID가 무엇이든 완벽하게 정렬 할 필요는 없습니다. – DarinH

1

COM과의 통신 문제로 인해 이러한 많은 문제를 해결하기 위해 C# 4.0의 dynamic을 사용할 수 있습니다.

dynamic 개체 및 선택적 매개 변수가 이러한 통증을 완화하기 위해 도입되었습니다.

+0

소비 환경이 .net이 아닌 경우이 도움이됩니까? 그러나 대체 모듈은 무엇입니까? –