000
17.08.2007, 12:58 Uhr
~thesnoopy
Gast
|
Hi,
ich bin gerade echt am verzweifeln. Ich versuche meine C++ dll für c# verfügbar zu machen. Ich habe mich entschieden zu diesem Zweck einen Wrapper zu schreiben, der aus managed Klassen besteht, die jeweils ein Objekt der unmanaged c++ Klasse beinhaltet. Des weiteren wird in der Managed Klasse jeweils ein Synonym für die einzelnen Funktionen der unmanaged Klasse implementiert. in diesen Funktionen kann ich nun die Variablen von c# nach c++ umformen und dann die unmanaged Funktion aufrufen. Jetzt zu meinem Problem:
1. Ich muß Klassen aus C# an die Wrapper Funktionen so übergeben, dass ich Änderungen, die der Wrapper gemacht hat, im Hauptprogramm sichtbar sind.
2. Ich muß Arrays von Klassen übergeben, mit der Anforderung aus 1.
Ich bin c++ Programmierer und würde (habe) es in c++ so gelößt:
C++: |
//Prototyp: class accesspoint{ //...// EDR_AP_SDK_ERROR dev_scan(BDADDR *addr_buff, COD *cod_buff, int *count); //...// }
//Aufruf: BDADDR bdaddr[20]; COD cod[20]; accesspoint ap; int count = 20; err = ap.dev_scan(&bdaddr[0], &cod[0], &count);
|
Jetzt das Ganze im Wrapper:
C++: |
public __gc class accesspoint_wrapper_class { public: //...// EDR_AP_SDK_ERROR dev_scan([Out] BDADDR_wrapper_class __gc* addr_buff, [Out] COD_wrapper_class __gc* cod_buff, int __gc* count); //...// }
|
In c# müßte ich es eigentlich so aufrufen:
Code: |
accesspoint_wrapper_class ap = new accesspoint_wrapper_class(); BDADDR_wrapper_class[] bd = new BDADDR_wrapper_class[20]; COD_wrapper_class[] cod = new COD_wrapper_class[20]; int count = 20; //...//
ap.dev_scan(out bd, out cod, ref count);
//...//
|
Problem: Bei "normalen" Variablen wie int funktioniert es, aber bei Klassen nicht. Fehlermeldung: Argument ... sollte nicht als out deklariert werden. Er möchte also die Klassen als Kopie übergeben, ich muß diese Klassen aber ändern.
Bitte hilft mir *bettel*
Gruß,
Carsten |