Ich möchte einfach eine C-Funktion von einer DLL in C# aufrufen. Diese C-Funktion gibt eine Struktur zurück.aufrufen C-Funktion mit Struktur als Rückgabewert in C#
Hier die .h-Datei Deklaration des C-DLL:
typedef struct t_Point{
int x;
int y;
} Point;
Point myFuncs();
Jetzt möchte ich diese Funktion in C# verwenden. Wrapper.cs:
using System.Text;
using System.Runtime.InteropServices;
namespace CSharp_mit_OpenCV
{
[StructLayout(LayoutKind.Sequential)]
public struct Point
{
public int x;
public int y;
};
class Wrapper
{
[DllImport("OpenCV Test.dll", CharSet= CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Struct)]
public static extern Point myFuncs();
}
}
Die Nutzung ist wie folgt:
Point p = Wrapper.myFuncs();
(Naming ist wahrscheinlich nicht die beste)
myFuncs erklärt nur eine Struktur, setzt einige Werte x und y und gibt es zurück. Das Problem: Die Werte in C# unterscheiden sich von denen in der C-Funktion. Es sollte 4 und 2 sein und es ist 0 und 111226272. Was ist das Problem hier?
Danke für jede Hilfe!
Raten Sie, es ist etwas mit Typenunterschieden: Probieren Sie in C# 'short' anstelle von' int' aus und versuchen Sie es mit 'uint' oder' ushort'. Können Sie die Bytes posten, die vom Prozess ausgegeben werden (bevor C# versucht, aus ihnen eine Struktur zu erstellen)? –
Gibt es immer 111226272 oder ist die Anzahl jedes Mal anders? –
Vergessen Sie nicht, sicherzustellen, dass die Aufrufkonvention korrekt ist (cdecl/fast-call, etc). Siehe hier: http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention.aspx – plinth