Was ist das geeignete Signatur/Marshall-Attribut, um Ausgabe-Parameter mithilfe von Zeigern params zu bekommen? Bisher habe ich versucht, dies:DllImport, wie man einzelne Werte als Referenz erhält
// Function to calculate the norm of vector. !0 on error.
// int err_NormVec(int size, double * vector, double * norm)
[DllImport("vectors.dll")]
int err_NormVec(int size, double[] vector, ref double norm)
Der bisherige Ansatz nicht den Wert Pop zurück von C auf .NET Ich habe auch versucht GCHandle, mit der IntPtr Unterschrift gepinnt zu verwenden.
[DllImport("vectors.dll")]
int err_NormVec(int size, double[] vector, IntPtr norm)
public void doSomething()
{
double norm = 0;
// ...
GCHandle handle = GCHandle.Alloc(norm, GCHandleType.Pinned);
int status = err_NormVec(vector.Lenght, vector, handle.AddrOfPinnedObject());
// ... clean gchandle, check status and so on
}
In diesem Fall habe ich den Wert zurück bekam aber auf der GCHandle.Target, nicht auf der ursprünglichen Norm. Was nervt. Ich würde gerne in der Lage sein, die intptr der Norm selbst nicht nur eine Kopie zu setzen.
Was ist die geeignete Signatur, um einen Wert mit einem Zeiger zurückzugeben? Gibt es eine unterstützte Möglichkeit, IntPtr auf einen int-Wert zu setzen? Diese
Ich habe vergessen zu erwähnen, dass ich win64 benutze. Das enthüllt einige schlechte Praktiken, die glücklicherweise auf Win32-Anwendungen arbeiten. – fprades
Zeigen Sie uns die Implementierung (oder zumindest die Signatur) von 'err_NormVec'. Sie müssen kein Double festhalten, um es als Out-Parameter zu verwenden, "ref" reicht aus. –
@EdS .: Sind Sie blind? – leppie