[C++/C#] COM Interop
Verfasst: 22.02.2010, 16:21
Hallo.
Ich benutze eine fremde DLL, die in C# geschrieben wurde und möchte Werte mit einer Funktion in dieser DLL berechnen.
Also habe ich eine neue DLL in C# geschrieben, die auf die originale zugreift und meiner C++-Anwendung als Proxy dient.
So wie hier.
Nun ist es so, dass es ungefähr so aussieht:
Dieser Code funktioniert tadellos. berechne() wird zweimal schnell hintereinander aufgerufen.
Jetzt kommts: Änder ich die Funktion wie folgt:
geht es auf einmal langsam. Das heisst FremdeKlasse() entzippt die Daten im Konstruktor und jeweils bei beiden berechne() aufrufen neu! Das ist natürlich Quatsch. Aber es hat sich ja auch etwas verändert: Ich übergebe die Parameter jetzt auch tatsächlich als Parameter der Funktion printHi().
In meinem C++-Programm wird mir dann angezeigt, die Methode hat den Parameter SAFEARRAY *.
Gut, denk ich mir, habe ein SafeArrayCreate() vom Typ VT_R4 erstellt und mit SafeArrayPutElement() befüllt.
Der Compiler beklagt sich nicht, die floats kommen in meiner Proxy-DLL auch richtig an.
Die Ausgabewerte der Methode berechne() sind auch korrekt, trotzdem dauerts halt ewig aufgrund...tja, weswegen eigentlich?
Ich habe bereits probiert, das float-Array in der printHi() Methode durch copyTo() zu kopieren, das ändert aber leider nichts.
Ich benutze eine fremde DLL, die in C# geschrieben wurde und möchte Werte mit einer Funktion in dieser DLL berechnen.
Also habe ich eine neue DLL in C# geschrieben, die auf die originale zugreift und meiner C++-Anwendung als Proxy dient.
So wie hier.
Nun ist es so, dass es ungefähr so aussieht:
Code: Alles auswählen
[Guid("C6659361-1625-4746-931C-36014B146679")]
public class InterfaceImplementation : IManagedInterface
{
public int PrintHi()
{
FremdeKlasse instanz = new FremdeKlasse();
/* Diese FremdeKlasse nutzt intern statische private Member, die unter anderem checken,
ob bereits ca. 300MB Daten in dem RAM entzippt wurden.
Das möchte ich nur einmal machen, da dass einige Sekunden in Anspruch nimmt und
ich die Funktion gerne schnell und öfters aufrufen möchte. */
float[] meineParameter = { 0.0f, 0.2f, 0.5f };
instanz.berechne(meineParameter);
// Berechne nochmal, um zu prüfen, ob es schnell geht :)
instanz.berechne(meineParameter);
return 33;
}
}
Jetzt kommts: Änder ich die Funktion wie folgt:
Code: Alles auswählen
public int PrintHi(float[] meineParameter)
{
FremdeKlasse instanz = new FremdeKlasse();
instanz.berechne(meineParameter);
instanz.berechne(meineParameter);
return 33;
}
In meinem C++-Programm wird mir dann angezeigt, die Methode hat den Parameter SAFEARRAY *.
Gut, denk ich mir, habe ein SafeArrayCreate() vom Typ VT_R4 erstellt und mit SafeArrayPutElement() befüllt.
Der Compiler beklagt sich nicht, die floats kommen in meiner Proxy-DLL auch richtig an.
Die Ausgabewerte der Methode berechne() sind auch korrekt, trotzdem dauerts halt ewig aufgrund...tja, weswegen eigentlich?
Ich habe bereits probiert, das float-Array in der printHi() Methode durch copyTo() zu kopieren, das ändert aber leider nichts.