È necessario "racchiudere" un SDK basato su C ++ dll / h / lib / xml / exe in una COM da utilizzare in un progetto C # 2.0

StackOverflow https://stackoverflow.com/questions/417146

  •  03-07-2019
  •  | 
  •  

Domanda

Mi è appena stato consegnato un SDK fatto di DLL C ++, lib, exe e vari file .h. Presumo che sia pensato per gli sviluppatori C ++. I progetti di esempio forniti con la loro documentazione sono tutti scritti in C ++. Sono in grado di farli girare con Visual Studio 8 (2005) ed eseguirli. Controllano il dispositivo come pubblicizzato. Tuttavia, il progetto che deve essere utilizzato è in C # .Net 2.0 e non è modificabile.

Il mio capo era uno sviluppatore C ++ e dice che tutto ciò che devo fare è compilarlo come oggetto COM e quindi importare l'oggetto COM nella mia soluzione C #. Il mio capo dice che dovrebbe impiegare meno di un'ora per "avvolgere". SDK come oggetto COM, anche per me senza conoscenza della compilazione C ++.

Ho usato oggetti COM nelle soluzioni C # prima, quindi una volta fatto ciò, posso continuare da lì senza problemi.

Tuttavia, non so cosa fare per creare l'oggetto COM dai file 2 .dll, 1 .exe, 1 .lib, 1 .xml e 12 .h. C'è una risorsa disponibile per dirmi cosa fare per far sì che ciò accada?

È stato utile?

Soluzione

  

Il mio capo era uno sviluppatore C ++ e dice che tutto ciò che devo fare è compilarlo come oggetto COM e quindi importare l'oggetto COM nella mia soluzione C #.

È vero, tuttavia la compilazione come oggetto COM è "difficile". (con questo, intendo che non puoi farlo) a meno che non implementi già le API COM (in caso contrario, devi implementare le API COM prima di poterlo costruire come oggetto COM).

Ci sono libri (ad esempio, COM essenziale ) che spiegano come creare oggetti COM usando C ++, ma non è banale (per costruire oggetti COM potrebbero esserci libri migliori di COM essenziale e strumenti migliori / più semplici di C ++).

Penso che tu e / o il tuo capo abbiate 3 opzioni:

  1. Chiedi al venditore di fornirle come oggetti COM
  2. Progetta un'API COM che avvolga l'API dell'SDK. Crea un progetto COM (nella lingua che preferisci) che esporta questa API. Implementare queste API invocando i metodi SDK sottostanti. Per fare ciò potresti aver bisogno di qualcuno che conosca il C ++ o sia disposto a spendere molto, molto più a lungo di "un'ora". su questo progetto.
  3. Dimentica l'uso di COM; crea invece l'SDK come DLL e usa PInvoke per richiamarlo dal codice .NET.
  

Il mio capo dice che dovrebbe impiegare meno di un'ora per "avvolgere " SDK come oggetto COM, anche per me senza conoscenza della compilazione C ++.

Sulla base di quello che hai detto, non so come fare per farlo.

Altri suggerimenti

Di 'al tuo capo se gli occorrerebbe meno di un'ora per concludere, dovrebbe certamente farlo: sarebbe un uso più efficiente di entrambi i tuoi tempi.

Suggerirei anche ATL (non usando gli attributi), ma è qualcosa che può richiedere del tempo per essere corretto se non si ha esperienza.

  

Il mio capo dice che dovrebbe richiedere meno di   un'ora per "avvolgere" c'è SDK come a   Oggetto COM, anche per me senza   conoscenza della compilazione C ++.

Questo può essere vero per uno sviluppatore C ++ / COM esperto, ma non per un principiante. Penso che la tua scommessa migliore sia usare ATL. Dai un'occhiata al tutorial MSDN .

E non utilizzano gli attributi.

Questo non risponde alla tua domanda, ma ...

Un'opzione invece di provare a creare un oggetto COM è usare P / Invoke e chiamare semplicemente i metodi nella DLL.

Questa discussione nei forum MSDN documenta come creare una DLL da chiamare usando P / Invoke.

Naturalmente se hai bisogno di accedere a un'intera classe (e creare un'istanza di detto oggetto), questo non sarà utile.

È positivo che il codice venga compilato ed eseguito per te. Detto questo, è assolutamente ingiusto presumere che tu possa farlo in un'ora.

Hai controllato per vedere cosa viene effettivamente creato da Visual Studio. Potrebbe esserci la possibilità che stia già costruendo un oggetto COM.

Scopri come viene chiamato il codice. Presumo che tu abbia un file .exe che puoi eseguire per testare il codice. Passa attraverso questo nel debugger VC ++ (è abbastanza simile al debug del codice C #) e prova a identificare tutte le chiamate API che corrispondono ai tuoi documenti / aspettative. Questa conoscenza sarà utile se si tenta di seguire il percorso P / Invoke.

Qualcos'altro da considerare è SWIG . Questo è in genere utilizzato dagli sviluppatori Python per racchiudere il codice C / C ++ e fornisce supporto per C #.

La route C ++ gestita è probabilmente più consigliabile per gli sviluppatori C ++ esperti perché è necessario comprendere molto sull'allocazione della memoria, per tutti tranne il codice più semplice.

Io (beh, davvero il mio esempio e io) proverò prima usando p / Invoke (tramite la funzione DllImport di System.Runtime.InteropServices) contro la dll dell'SDK fornita dalla società. Ti farò sapere come va.

Penso che ciò di cui hai veramente bisogno / bisogno sia C ++ / CLI, in questo modo puoi semplicemente costruirli direttamente in un assembly gestito. L'idea è di scrivere un wrapper piuttosto semplice che assomigli a un incrocio tra C # e C ++ e poi faccia il resto.

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