문제

내가 가지고있는 com 객체 (sc_com.dll)에 대한 c# 래퍼를 생성하려고하지만 Visual Studio 2008 (Vista 실행)과 연결하는 몇 가지 문제가 있습니다. COM DLL과 함께이 등록이 필요하지 않아야합니다. Manifest 파일을 사용하여 Visual Studio에 SC_COM.DLL에 대해 알리십시오. Tblimp.exe를 사용하여 Visual Studio 2008에서 참조하는 유형 라이브러리 (SC_COMTLB.DLL)를 생성하여 필요한 DLL과 조기 바인딩을 할 수 있습니다. DLL은 매니페스트 및 실행 파일과 동일한 디렉토리에 있습니다.

문제는 다음과 같습니다. 개체를 인스턴스화하고 C#에서 해당 메소드 중 하나를 호출하려고하면 다음 오류가 발생합니다.

오류 감지 : 'sc_comtlb.scaccessobjclass'유형의 com 객체를 인터페이스 유형 'sc_comtlb.iscuploader'로 캐스트 할 수 없습니다. 이 작업은 IID '{C677308A-AC0F-427D-889A-47E5DC990138}과의 인터페이스에 대한 COM 구성 요소에서 QueryInterface 호출을 호출하여 실패했습니다. 다음 오류로 인해 다음 오류로 인해 실패했습니다 (HRESULT : 0x80004002 (e_nointerface)의 예외). .

이 오류가 무엇을 의미하는지 확실하지 않습니다. 오류 코드에서 검색을 수행했으며 비교적 일반적인 C# 오류 인 것으로 보입니다. 그렇다면 COM 객체를 여기에 잘못된 길로 연결하려고합니까, 아니면 다른 중요한 단계가 누락 되었습니까?

나는 내가 생산 한 유형 라이브러리 (s c_comtlb.dll)가 시스템에 등록되지 않았기 때문에 실제 com dll이 어디에 있는지 알고있는 방법을 완전히 확신하지 못할 것입니다. 예배 규칙서. 이것이 잠재적으로 문제가 될 수 있으며, 그렇다면 어떻게 두 가지를 더 잘 연결할 수 있습니까?

도움이 되었습니까?

해결책

app.exe.manifest에 이것을 추가하십시오 :

<comInterfaceExternalProxyStub 
  name="ISCUploader" 
  iid="{C677308A-AC0F-427D-889A-47E5DC990138}"
  proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
  baseInterface="{00000000-0000-0000-C000-000000000046}"
  tlbid = "{PUT-YOUR-TLB-GUID-HERE}" />

Visual Studio에서 tlbid를 찾을 수있는 곳 avatile.namespace.assembly.name.manifest, 다음과 같이 보입니다.

<typelib tlbid="{A-GUID-IS-HERE--USE-IT}"
  version="1.0" helpdir="" resourceid="0" flags="HASDISKIMAGE" />

나는 꽤 오랫동안 이것에 대해 머리를 두드리고 있었지만,이 유용한 참고 문헌을 발견하고 함께 조각했고 그것은 나를 위해 일하고 있습니다.

다른 팁

오류 코드는 해당 Visual Studio를 의미합니다 생각합니다 특정 객체는 특정 인터페이스를 구현해야하지만 해당 인터페이스에 "연결"하려고 할 때 객체는 알지 못한다고 응답합니다.

문제는 SC_COM.DLL에 있다고 생각합니다. tlbimp.exe는 DLL 내에 저장된 메타 데이터의 클래스 및 인터페이스 정보를 추출하고 클래스 용 랩퍼를 빌드합니다.

예를 들어, SC_COM이 C ++로 작성된 경우 DLL의 제작자가 IDL 파일에 클래스가 해당 인터페이스를 구현한다고 표시된 경우에 발생할 수 있지만 실제 코드는 해당 인터페이스를 지원하지 않습니다.

이 DLL이 가질 수있는 또 다른 일반적인 문제의 원인은 다음과 같습니다. 때로는 Isomething2 인터페이스를 구현하는 클래스가 있으며 Isomething 인터페이스에서 파생되지만 등급 구현은 Isomething2 만 인식합니다. 파생 인터페이스를 구현하는 경우 기본 인터페이스도 인식해야합니다. 이것은 일반적인 실수입니다.

DLL의 소스 코드가 있습니까?

어떤 버전의 Windows? Windows Vista이므로 내부 매니페스트는 외부 매니페스트를 무시합니다. 기본적으로 C# 실행 파일은 내부 매니페스트가있어 whatever.exe.manifest 파일은 무시됩니다.

C# exe의 속성 페이지로 이동하면 "응용 프로그램 탭"에 "아이콘 및 매니페스트"섹션이 있음을 알 수 있습니다. "매니페스트"를 매니페스트 파일의 이름으로 설정하면 기본 파일 대신 내장됩니다.

그렇지 않으면 작동하지 않으면 Mt.exe를 사용하여 외부 명함을 기본 내부의 내부와 병합하고 병합 된 매니페스트를 .exe 파일에 다시 넣으려면 몇 가지 사후 제작 단계를 수행해야 할 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top