2010-11-18 2 views
1

Je veux simplement appeler une fonction C d'une DLL en C#. Cette fonction C renvoie une structure.invoquer la fonction C avec struct comme valeur de retour dans C#

Voici la déclaration .h fichier de dll c:

typedef struct t_Point{ 
int x; 
int y; 
} Point; 


Point myFuncs(); 

Maintenant, je veux utiliser cette fonction en C#. 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(); 
    } 
} 

L'utilisation est la suivante:

Point p = Wrapper.myFuncs(); 

(Naming est probablement pas le meilleur)

myFuncs déclare seulement struct, met des valeurs à x et y et le renvoie. Le problème: Les valeurs que je reçois en C# sont différentes de celles générées dans la fonction C. Il devrait être 4 et 2 et il est 0 et 111226272. Quel est le problème ici?

Merci pour toute aide!

+0

Dites que c'est quelque chose avec des différences dans les types: essayez C# 'short' au lieu de' int', et essayez avec 'uint' ou' ushort'. Pouvez-vous poster les octets qui sont sortis par le processus (ainsi avant que C# essaye de créer une structure d'eux)? –

+1

Est-ce qu'il retourne toujours 111226272 ou est-ce que le numéro diffère à chaque fois? –

+0

N'oubliez pas de vous assurer que la convention d'appel est correcte (cdecl/fast-call, etc). Voir ici: http://msdn.microsoft.com/fr-fr/library/system.runtime.interopservices.callingconvention.aspx – plinth

Répondre

0

Votre code de marshall semble correct, quelle est la disposition de paquet de la méthode non managée? LayoutKind.Sequential traitera vos ints comme 4 octets. Vérifiez si c'est correct.

Questions connexes