2010-12-09 31 views
1

J'essaye d'appeler le code non managé utilisant C#.C# appelant le code non managé

extern "C" __declspec(dllexport) LPBYTE DataReceived(LPBYTE signals) 
{ 
    LPBYTE test; 
    *(WORD*)(test) = 0x0C; 
    *(WORD*)(test + 2) = 0x1000; 

    return test; 
    // I even tried returning 0x00 only; and I was still getting the exception 

} 

code C#

internal sealed class Test 
{ 
    [DllImport("testlib.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] 
    public static extern byte[] DataReceived(byte[] signals); 

} 

// signals is byte[] too 
byte[] foo = Test.DataReceived(signals); 

//exception that occurs 
A first chance exception of type 'System.Runtime.InteropServices.MarshalDirectiveException 

J'ai une autre fonction qui renvoie une valeur int très bien, je suppose que c'est lié à lui-même LPBYTE. Appréciez toute aide.

Répondre

3

Je crois que vous voulez utiliser

internal sealed class Test 
{ 
    [DllImport("testlib.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] 
    public static extern IntPtr DataReceived(byte[] signals); 

} 

Notez que lorsque vous l'appelez, vous devrez utiliser Marshall.Copy pour obtenir les données, mais cela exigera que vous connaissez la longueur des données.

IntPtr fooPtr = Test.DataRecieved(signals); 
var foo = new byte[LENGTH]; 
Marshall.Copy(fooPtr, foo, 0, LENGTH); 
+0

Ça a marché, génial. Je vous remercie. – unmanageddude

0

livre adam nathans est la Bible sur cette

accrocher: quelle est exactement la valeur de retour de cette fonction. C'est un pointeur vers quoi?

points de test à l'adresse aléatoire, alors vous percez les données où les points de test

Que voulez-vous revenir?

Si vous devez renvoyer un pointeur, déclarez la fonction comme renvoyant intptr puis appelez Marshall pour copier les octets. Puis vous devez décider si vous devez libérer le tampon retourné

0

Comment le marshaller .NET devrait savoir combien de données doivent être copiées du tableau retourné dans une instance de tableau gérée?

Vous pouvez essayer d'accepter un IntPtr comme résultat, puis utiliser la classe Marshal pour copier les données.