2009-04-12 9 views
1

Je suis très nouveau en C# (j'ai commencé à apprendre la semaine dernière).Utilisation de tableaux et de pointeurs en C# avec C DLL

J'ai une DLL personnalisée écrit en C avec la fonction suivante:

DLLIMPORT void test_function (double **test) 

Ce que je cherche à faire est d'avoir un pointeur de C# pour le tableau « test ». Donc, si dans la fonction DLL, j'ai test [0] = 450,60, test [1] = 512,99 etc. Je veux pouvoir avoir cela disponible dans mon programme C#.

Dans le programme C# J'ai quelque chose de similaire à:

namespace TestUtil 
{ 
    public class Echo 
    { 
    public double[] results = new double[10]; 
    public double[] results_cpy = new double[10]; 


    [DllImport("test_dll.dll", CallingConvention = CallingConvention.Cdecl)] 
    static extern unsafe void test_function(ref double[] Result); 

    public unsafe void Tell() 
    { 
     results[0] = 0.0; 
     results[1] = 0.0; 

     results_cpy[0] = 0.0; 
     results_cpy[1] = 0.0; 

     test_function(ref results); 
     results_cpy[0] = (double)results[0] + (double)results[1] ; 
    } 
    } 
} 

Dans la fonction 'test_function' DLL J'utilise les éléments suivants:

*test[0] = 450.60; 
*test[1] = 512.99; 

Dans le tout DLL était OK (j'ai utilisé boîte de message dans la DLL pour vérifier les valeurs ont été appliquées). De retour dans le programme C#, les résultats [0] 'semblent très bien et je peux en tirer des valeurs, mais' results [1] 'me donne un index hors limites. Je le sais parce que si j'omets '+ (double) résultats [1]' je ne reçois aucune erreur. De plus, si je ne fais aucune tentative dans la DLL pour modifier 'test [1], elle conserve la valeur originale de C# (dans mon exemple 0.0).

De toute évidence, je ne fais pas quelque chose de bien, mais c'est le plus proche que j'ai pu obtenir pour que cela fonctionne. Tout ce que j'ai essayé échoue misérablement.

Toute aide serait grandement appréciée.

Répondre

1

Je devine que vous connaissez déjà C++; Si c'est le cas, vous devriez vraiment regarder C++/CLI qui vous permet d'utiliser facilement le code managé (.NET) de C++. Le code que vous avez montré ci-dessus n'est vraiment pas très semblable à C# (vous devriez complètement éviter unsafe).

+0

+1 pour éviter les risques. Il y a presque toujours un meilleur moyen. – Rap

0

Question similaire sur SO here. Si vous regardez un pointeur opaque, il est probable que ce soit un système by-ref InPtr comme décrit dans l'autre thread. Par ailleurs, pourquoi ne pas en faire un double * au lieu de double **. Cela rendrait la vie plus facile, je pense.

5

Il n'y a pas besoin de code dangereux. En fait, il n'est pas nécessaire de passer par référence du tout. Si votre signature ressemble à ceci:

void test_function (double *test) 

et votre importation ressemble à ceci:

static extern void test_function(double[] Result); 

Ensuite, tout devrait bien fonctionner. Autrement dit, en supposant que vous avez seulement besoin de modifier le tableau et ne pas retourner un tableau complètement nouveau.