2010-02-04 4 views
0

J'ai besoin d'appeler une fonction c importée depuis une DLL. Je peux trouver comment importer la fonction d'api mais je ne sais pas comment marier tous les types attendus par la fonction en tant que paramètres. Types de pointeurs en particulier.Comment marshaler les types de pointeur lors de l'appel de la fonction C dll en C#

Exemple signature de la fonction peut être ...

result_type get_signal_value (SIG * sig, nom char *, int valeur *); Où SIG est une structure contenant divers éléments. par exemple. struct SIG { char sig_id [16]; int sig_ptr; HW_ADDR_TYPE hw_info; };

et

struct HW_ADDRESS_TYPE { court channel_no; châssis de char non signé; emplacement char non signé; lien char non signé; remplisseur de char non signé; };

Je peux constater que ce type au maréchal je dois décrire la mise en page de la structure ...

[StructLayout (LayoutKind.Sequential)] public class HW_ADDRESS_TYPE { court channel_no; châssis d'octets; emplacement d'octet; liaison d'octets; octet de remplissage; };

[StructLayout (LayoutKind.Sequential)] public class SIG { const public int LEN_SID = 16; [MarshalAs (UnmanagedType.ByValTStr, SizeConst = LEN_SID)] chaîne publique sig_id; int sig_ptr; HW_ADDRESS_TYPE hw_info; };

mais semblent avoir des problèmes ici. l'ai-je fait correctement?

Identique à int * dans l'exemple.

Toute aide serait géniale. À votre santé!

Répondre

0
[StructLayout(LayoutKind.Sequential)] 
struct SIG 
{ 
    // describe the fields here 
} 

[DllImport("lib.dll")] 
static extern bool get_signal_value(SIG sig, string name, float value); 

que vous pourriez appeler:

SIG sig = new SIG(); 
sig.Field1 = value1; 
sig.Field2 = value2; 
bool result = get_signal_value(sig, "abc", 1.5f); 
+0

peut vous être re plus spécifique. la disposition de la structure? Voulez-vous dire que pour monter une valeur de pointeur, vous n'avez rien à faire? Voir la question éditée ... – user226356

+0

Essayez d'utiliser 'struct' au lieu de' class' pour les types 'SIG' et' HW_ADDRESS_TYPE' en C# –

Questions connexes