Verwendung von arrays und Zeigern in C# mit C # - DLL
Ich bin sehr neu in C# (gerade angefangen zu lernen, in der vergangenen Woche).
Habe ich eine benutzerdefinierte DLL, die in C geschrieben mit folgender Funktion:
DLLIMPORT void test_function (double **test)
Was ich Suche zu tun haben, ist ein Zeiger von C# für das array 'test'.
So, wenn man in die Funktion in der DLL habe ich test[0] = 450.60, test[1] = 512.99 etc. Ich will im Stande sein zu haben, dass in meinem C# - Programm.
In der C# - Programm habe ich etwas ähnliches wie:
namespace TestUtil
{
public class Echo
{
public double[] results = new double[10];
public double[] results_cpy = new double[10];
[DllImport("test_dll.dll", CallingConvention = CallingConvention.Cdecl)]
static extern unsafe void test_function(ref double[] Result);
public unsafe void Tell()
{
results[0] = 0.0;
results[1] = 0.0;
results_cpy[0] = 0.0;
results_cpy[1] = 0.0;
test_function(ref results);
results_cpy[0] = (double)results[0] + (double)results[1] ;
}
}
}
In der DLL 'test_function' - Funktion, die ich verwendet die folgenden:
*test[0] = 450.60;
*test[1] = 512.99;
Innerhalb der DLL war alles OK (ich habe eine message-box, die innerhalb der DLL, um die Werte zu überprüfen, wurden angewandt). Zurück in der C# - Programm 'Ergebnisse[0]' scheint in Ordnung zu sein und ich kann Werte aus, aber die Ergebnisse[1]' gibt mir einen index out of bounds error. Ich weiß das, weil wenn ich das weglasse '+ (Doppel -) Ergebnisse[1]' ich keine Fehlermeldung. Auch, wenn ich nicht versuchen innerhalb der DLL zu ändern "test[1]" es bleibt der ursprüngliche Wert von C# (in meinem Beispiel 0.0).
Offensichtlich bin ich nicht etwas Recht, aber dies ist die nächste habe ich in der Lage zu bekommen, dass es überhaupt funktioniert. Alles andere habe ich versucht, scheitert kläglich.
Jegliche Hilfe würde sehr geschätzt werden.
InformationsquelleAutor | 2009-04-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keine Notwendigkeit für unsicheren code. In der Tat, es gibt keine Notwendigkeit, referenzübergabe an alle. Wenn deine Signatur sieht wie folgt aus:
und Ihr import sieht wie folgt aus:
Dann sollte alles gut funktionieren. Das heißt, vorausgesetzt, Sie benötigen lediglich zum ändern der array-und nicht wieder ein komplett neues array.
InformationsquelleAutor Simon Broadhead
Ich vermute, dass Sie bereits wissen, C++; wenn das der Fall ist, Sie wirklich sollte Blick auf C++/CLI können Sie ganz einfach mithilfe von verwaltetem code (.NET) von C++. Der code, den Sie gezeigt haben, dass der oben ist wirklich nicht sehr C#-ähnliche (Sie sollten vollständig vermeiden
unsafe
).InformationsquelleAutor Ðаn
Ich bin nicht sicher, was schief läuft, aber ich kann sicherlich verweisen Sie auf einen Artikel, dass die Gespräche über p/invoke. sehen, falls dir das hilft.
http://msdn.microsoft.com/en-us/magazine/cc164123.aspx
InformationsquelleAutor Srikar Doddi
Ähnliche Frage auf SO hier. Ihr Blick auf einen undurchsichtigen Zeiger, so ist es wahrscheinlich ein by-ref-system InPtr wie beschrieben im anderen thread.
Durch die Art und Weise, warum nicht machen es zu einem Doppel - * statt double**. Das würde das Leben leichter machen, denke ich.
InformationsquelleAutor JP Alioto