Ich habe einige ANSI-Standard-C-Codes, die maßgebend sind. Das bedeutet, dass ich, obwohl ich den Quellcode habe, weder in eine andere Sprache übersetzen noch die Aufrufargumente ändern kann, da diese Aktionen die Autorität aufheben würden. Es gibt über 150 Funktionen.
Ich kann beiläufige Änderungen vornehmen, z. B. die Dateinamen von .C in .CPP ändern, damit es mit dem C++-Compiler von Visual Studio 2009 kompiliert werden kann, was ich getan habe. Compilerdirektiven und dergleichen können ebenfalls hinzugefügt werden. Falls erforderlich, kann ich auch eine Wrapper-Ebene einfügen.
Eine weitere Einschränkung ist, dass mein Unternehmen no wollen, dass ich die unsicher Schlüsselwort in jedem C#-Code.
Ich muss auf diese Funktionen von einem C#-Programm aus zugreifen.
Eine typische C/C++-Funktion sieht wie folgt aus:
double SomeFunction(double a, double[3] vec, double[3][3] mat);
Wobei der Inhalt des Arrays manchmal Eingabe, manchmal Ausgabe und selten beides ist.
Ich habe zunächst versucht, eine nicht verwaltete DLL zu erstellen (mit den als Extern C gekennzeichneten Funktionen). Funktionen mit nur einfachen Argumenten (int, double) funktionierten gut, aber ich konnte nicht herausfinden, wie man die Arrays marshalen kann. (Tatsächlich habe ich einige Beispielcodes gefunden, aber sie waren extrem komplex und es war unvernünftig, sie 150 Mal zu duplizieren).
Ich habe dann zwei Projekte innerhalb derselben Lösung ausprobiert, eines in C++ und das andere in C#. Im C++-Projekt habe ich eine verwaltete Funktion erstellt, die lediglich die ursprüngliche Funktion aufrief, die als nicht verwaltet gekennzeichnet war. Das war extrem sauber und einfach, und auch hier funktionierten einfache Argumente problemlos. Aber für Arrays konnte ich nicht herausfinden, wie man die Argumenttypen über die Grenze zwischen C# und C++ hinweg anpasst:
_Argument '2': cannot convert from 'double[]' to 'double*'_
(und wie oben erwähnt, kann ich unsafe nicht verwenden, um einen Zeiger zu erhalten).
Das, was ich vorhabe, muss natürlich möglich sein.
Wie kann man diese Funktionen am besten erreichen?
(Ein Beispielcode, der die obige Funktion verwendet, wäre wirklich cool).