Ho un sistema piuttosto grande implementato in C++ con cui ho bisogno di interagire. Il sistema ha un'API piuttosto grande, un numero di DLL C++. Queste DLL esportano le classi C++, al contrario di una bella API in stile C. e ho bisogno di usarli da un nuovo progetto C#.Come chiamare un'API C++ da C#
Da quello che so .NET ha tre modalità di interazione con software nativo:
- P/Invoke -, che funziona solo su C API
- oggetti COM
- C++/CLI
Quindi, per come ho capito, ho tre approcci di conseguenza:
- Scrivere un wrapper in C e chiamarlo con P/Invoke. che sembra troppo lavoro.
- Scrittura di un wrapper con COM. che non so come fare e, a meno che non sia così facile, sono riluttante ad apprendere ciò che mi sembra - una tecnologia che muore.
- Scrittura di un wrapper in C++/CLI. che sembra il minimo lavoro, anche se ancora molto.
La mia domanda:
Prima di tutto vorrei sapere perché non mi permette .NET semplicemente di usare le classi C++ "così come sono"? Suppongo che sia una questione di gestione della memoria . e se lo è, sono più che disposto a scrivere i finalizzatori, e implementando IDisposable. Da quello che so, le classi C++ sono solo strutture veramente fantasiose, e poiché P/Invoke supporta le strutture e le funzioni che accettano le strutture come primo parametro, perché non supportare le classi ?
In secondo luogo, supponendo che io sia veramente pigro e che sia molto noioso, noioso, , quale sarebbe il modo migliore per utilizzare queste DLL? una possibilità chiamarli direttamente da C# sarebbe la migliore. Altrimenti, vorrei che lo amasse uno strumento automatico per produrre i wrapper. Inoltre, le DLL potrebbero cambiare , probabilmente, solo leggermente ma ancora, l'id piuttosto non essere forzato per ri-scrivere manualmente i wrapper.
Per davvero una buona risposta, soprattutto sulla prima parte, o un buon strumento automatico, ti ricompenserò una taglia ...
Grazie
1. Poiché diverse DLL hanno diverse convenzioni di chiamata. –
http://stackoverflow.com/questions/2120690/tool-for-creating-net-wrappers-for-a-com-dll –
Penso che C++/CLI sarebbe buono. Tuttavia, non ho esattamente esperienza con le esportazioni C++. – chris