bog
Ensign
- Registriert
- Apr. 2008
- Beiträge
- 254
hey!
um meine c++- und c#-kenntnisse, gerade mit dem build-prozess unter windows, war es nie uebertrieben gut bestellt. aktuell scheitere ich am im titel genannten versuch, eine in c++ geschriebene und kompilierte DLL in ein in c# geschriebenes programm einzubinden (p/invoke).
die C++-bibliothek:
dabei handelt es sich um recht ueberschaubaren code, der per undokumentierter windows com schnittstelle das standard-audio-ausgabegeraet umstellt. der obige link enthaelt unten einen download eines kompletten VS projekts. das kompiliert auch fein und funktioniert.
ich habe im enthaltenen code den aufruf an die windows-schnittstelle insofern ausgekapselt, als dass die CLI-parameteruebergabe nur noch in der main-funktion stattfindet und diese dann eine funktion folgender signatur aufruft, die ich dann auch vom c#-projekt heraus verwenden moechte:
zum offenlegen der funktion habe ich in der headerdatei folgende zeilen angebracht, die ich aus dem internet adaptiert habe:
in den property pages des projekts habe ich unter configuration properties -> general -> project defaults den configuration type auf dynamic library, sowie den CLR support angeschalten. das ganze kompiliert fein, wenn ich es als .exe kompiliere laeuft das auch wie zuvor prima von der kommandozeile aus, und das .dll-kompilat kopiere ich nun in mein C#-projekt.
dort importiere ich die funktion wie folgt als methode:
das kompiliert auch fein, der c#-code fuehrt fehlerfrei aus, jedoch bleibt die funktion des c++-codes komplett aus:
gibt mir einen wert von "-2147417850" zurueck, das audiogeraet wird nicht geaendert, und eine ausgabe der audiogeraete per stdout wie im code des c++-projektes gedacht geschieht nicht.
der int-datentyp ist fuer die beiden sprachen soweit ich das verstehe gleich, daher kein marshalling noetig. ueberseh ich hier was?
um meine c++- und c#-kenntnisse, gerade mit dem build-prozess unter windows, war es nie uebertrieben gut bestellt. aktuell scheitere ich am im titel genannten versuch, eine in c++ geschriebene und kompilierte DLL in ein in c# geschriebenes programm einzubinden (p/invoke).
die C++-bibliothek:
dabei handelt es sich um recht ueberschaubaren code, der per undokumentierter windows com schnittstelle das standard-audio-ausgabegeraet umstellt. der obige link enthaelt unten einen download eines kompletten VS projekts. das kompiliert auch fein und funktioniert.
ich habe im enthaltenen code den aufruf an die windows-schnittstelle insofern ausgekapselt, als dass die CLI-parameteruebergabe nur noch in der main-funktion stattfindet und diese dann eine funktion folgender signatur aufruft, die ich dann auch vom c#-projekt heraus verwenden moechte:
C++:
int ChangeAudioDevice(int option)
zum offenlegen der funktion habe ich in der headerdatei folgende zeilen angebracht, die ich aus dem internet adaptiert habe:
C++:
#ifdef ENDPOINTCONTROLLER_EXPORTS
#define ENDPOINTCONTROLLER_API __declspec(dllexport)
#else
#define ENDPOINTCONTROLLER_API __declspec(dllimport)
#endif
extern "C" ENDPOINTCONTROLLER_API int ChangeAudioDevice(int option);
in den property pages des projekts habe ich unter configuration properties -> general -> project defaults den configuration type auf dynamic library, sowie den CLR support angeschalten. das ganze kompiliert fein, wenn ich es als .exe kompiliere laeuft das auch wie zuvor prima von der kommandozeile aus, und das .dll-kompilat kopiere ich nun in mein C#-projekt.
dort importiere ich die funktion wie folgt als methode:
C#:
[DllImport("EndPointController.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "ChangeAudioDevice")]
static extern int ChangeAudioDevice(int option);
das kompiliert auch fein, der c#-code fuehrt fehlerfrei aus, jedoch bleibt die funktion des c++-codes komplett aus:
C#:
Console.WriteLine(ChangeAudioDevice(-1));
der int-datentyp ist fuer die beiden sprachen soweit ich das verstehe gleich, daher kein marshalling noetig. ueberseh ich hier was?
Zuletzt bearbeitet: