Domanda

Sto cercando di produrre un C # wrapper per un oggetto COM che ho (chiamato SC_COM.dll), ma sto avendo alcuni problemi che la collegano con Visual Studio 2008 (con sistema operativo Vista). Ho bisogno di fare questo con la DLL COM senza registrazione - sto usando un file manifesto di lasciare Visual Studio conoscere SC_COM.dll, e che sembra funzionare. Ho usato TblImp.exe per generare una libreria di tipi (SC_COMtlb.dll) che sto riferimento in Visual Studio 2008 in modo da poter fare presto vincolante con la DLL che ho bisogno. Le DLL sono entrambi nella stessa directory come il manifesto e l'eseguibile.

Ecco il problema: Quando ho un'istanza dell'oggetto e cercare di chiamare uno dei suoi metodi in C #, getta il seguente errore:

  

Errore rilevato: Impossibile eseguire il cast di oggetti COM di tipo 'SC_COMtlb.SCAccessObjClass' al tipo di interfaccia 'SC_COMtlb.ISCUploader'. Questa operazione non è riuscita perché la chiamata QueryInterface sul componente COM per l'interfaccia con IID '{C677308A-AC0F-427D-889A-47E5DC990138}' non riuscita a causa del seguente errore: Interfaccia non supportata (Eccezione da HRESULT: 0x80004002 (E_NOINTERFACE)) .

Non sono del tutto sicuro che cosa significa questo errore - ho fatto una ricerca sul codice di errore, e sembra essere un errore di relativamente generale C #. Così sto andando sul collegamento l'oggetto COM nel modo sbagliato qui, o c'è qualche altro importante passo potrei mancare?

Probabilmente dovrei notare che io non sono del tutto sicuro di come la libreria dei tipi (S \ C_COMtlb.dll) che ho prodotto sa dove la DLL COM reale è, dal momento che non è registrato con il sistema - suppongo che sembra proprio nella stessa directory. Questo potrebbe potenzialmente essere il problema, e se sì, come posso meglio collegare le due cose?

È stato utile?

Soluzione

Prova ad aggiungere questo alla tua 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}" />

Dove tlbid può essere trovato da Visual Studio generato Native.Namespace.Assembly.Name.manifest, cercando in questo modo:

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

Mi è stato sbattere la testa contro questo per un bel po 'di tempo, ma ho trovato questi riferimenti utili e ricostruito insieme e che sta funzionando per me:

Altri suggerimenti

il codice di errore significa che Visual Studio pensa che un certo oggetto dovrebbe implementare una certa interfaccia, ma quando cerca di "connettersi" per tale interfaccia l'oggetto risponde che non sa su di esso.

Direi che il problema è in SC_COM.dll. Tlbimp.exe estrae le informazioni di classe e l'interfaccia dai metadati memorizzati all'interno della DLL e costruisce wrapper per la classe.

Per esempio, se SC_COM è scritto in C ++, questo potrebbe accadere se il creatore della DLL indicata nel file di IDL che una classe implementa tale interfaccia, ma il codice vero e proprio non supporta tale interfaccia.

Ecco un altro comune fonte di problemi questa DLL potrebbe avere: a volte si dispone di una classe che implementa un'interfaccia ISomething2 che deriva da un'interfaccia ISomething, ma l'implementazione della classe a riconoscere solo ISomething2. Se si implementa un'interfaccia derivata, è necessario riconoscere la sua interfaccia di base pure. Questo è un errore comune.

Hai (e controllo) il codice sorgente per la DLL?

Quale versione di Windows? Dal momento che Windows Vista, un manifesto interna sostituisce un manifesto esterno. Per impostazione predefinita, C # eseguibili hanno manifesta interne, il che significa che il file whatever.exe.manifest verrà ignorato.

Se andate alla pagina delle proprietà per il vostro C # EXE, vedrete c'è una sezione sulla scheda "Applicazione" "Icon e manifesta". Impostare "Manifesto" per il nome del file manifesto, e sarà inserito al posto di quello di default.

Se questo non funziona, potrebbe essere necessario fare un po 'di post-generazione passi con Mt.exe al fine di unire il manifesto esterna con quella interna di default uno e mettere il manifesto fuse indietro nel file exe.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top