Parameterübergabe von C# an C++ DLL (char *argv[])
-
Hallo,
ich habe keine Ahnung von C++, muss aber aus C# eine C++ DLL aufrufen, die als Parameter den Typ "char *argv[]" erwartet.
Hier der C++ teil:
#define DllExport __declspec( dllexport ) DllExport int f_xy(char *params[]); int f_xy(char *params[]) { ... }
Wie kann ich nun aus meinem C# Programm diese C++ Funktion aufrufen und Parameter übergeben?
Ich suche schon den ganzen Tag bei Google - finde aber leider nix dazu.
Kann mir jemand helfen?
Grüße
Andy
-
Als Einstieg könntest du zum Beispiel folgende Seiten durchstöbern:
- http://msdn.microsoft.com/de-de/magazine/cc164123(en-us).aspx
- http://www.pinvoke.net
- http://www.google.de/search?hl=de&q=c%23+c%2B%2B-dll&btnG=Google-Suche&meta=Speziell zu deinem Problem (wobei evtl. das Array Schwierigkeiten machen könnte) probier folgende Deklaration:
[DllImport("xyz.dll")] public static extern int f_xy(string[] params);
-
Danke,
für die Antwort.
Prinzipiell schon mal nicht schlecht.
Allerdings erhalte ich in meinen C++ Code immer nur das 1. Zeichen meines Paramter Arrays.
Beispiel:string[] p = new string[2]; p[0] = "abcd"; p[1] = "1234"; f_xy(p); ...
int f_xy(char *argv[]) { char* param1; char* param2; argv = &argv[optind]; param1 = *argv++; param2 = *argv++; ...
param1 hat den Wert "a"
param2 hat den Wert "1"Irgendeine Idee?
-
h
/edit: eigentlich sollte hier "hups" stehen, da ich mich beim beitrag verlesen hab und somit nur rotz hier stand... hat wohl beim schrieben den fokus verloren
-
Andy01 schrieb:
Danke,
für die Antwort.
Prinzipiell schon mal nicht schlecht.
Allerdings erhalte ich in meinen C++ Code immer nur das 1. Zeichen meines Paramter Arrays.
Beispiel:string[] p = new string[2]; p[0] = "abcd"; p[1] = "1234"; f_xy(p); ...
int f_xy(char *argv[]) { char* param1; char* param2; argv = &argv[optind]; param1 = *argv++; param2 = *argv++; ...
param1 hat den Wert "a"
param2 hat den Wert "1"Irgendeine Idee?
Klingt mir nach Null-Bytes innerhalb der einzelnen Zeichen. C# und .NET verwenden ja intern eine Art
wchar_t
fürSystem.String
s, welches breiter ist alschar
in deinemchar *argv[]
. Für "normale" Zeichen, sprich dem was mitchar
dargestellt werden kann werden imwchar_t
die nicht gebrauchten Bytes einfach auf null gesetzt (stark vereinfacht gesagt^^). Eventuell wirdp
für deine Zwecke unbrauchbar gemarshaled (diese Wörter, da kommts mir gleich :p ), anstelle von einemchar *[]
bekommst du einenwchar_t *[]
in deinem C++ Programm, was jedoch vom Compiler nicht bemerkt wird, da der Zeiger zur Laufzeit keinen Typen mehr hat. Du musst das irgendwie gerade biegen, mit einem Interop-Attribut beim Argument derDllImport
ierten Funktion... oder so ähnlich - kann es dir leider nicht genauer sagen weil ich sowas noch nie gemacht habe (programmiere ja C++/CLI, brauche ich sowas nicht)
pohlmann schrieb:
h
Well done, sir! Very well indeed
MfG
-
Es müsste mit dem CharSet Attribute gehen.
-
hustbaer schrieb:
Es müsste mit dem CharSet Attribute gehen.
Richtig. Bei mir hat folgende Einstellung funktioniert:
[DllImport(DRIVER_DLL_NAME,CharSet=CharSet.Ansi)]