2010-11-18 11 views
1

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!

+0

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)? –

+1

Gibt es immer 111226272 oder ist die Anzahl jedes Mal anders? –

+0

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

Antwort

0

Ihr Marshall-Code scheint korrekt zu sein, was ist das Pack-Layout der nicht verwalteten Methode? LayoutKind.Sequential behandelt Ihre Eingaben als 4 Byte. Überprüfen Sie, ob das korrekt ist.

Verwandte Themen