2010-12-12 43 views
0

J'ai importé mes fonctions C++ DLL en C# en suivant quelques exemples en ligne. Les fonctions doivent être déclarées dans le cadre d'une classe C#. Mais si je veux utiliser ces fonctions dans d'autres classes C#, comment puis-je partager les déclarations?Comment puis-je partager les fonctions C# DllImport entre les fichiers?

La meilleure solution serait d'importer les fonctions C++ DLL dans une classe générale et utiliser tout au long de ma demande.

Merci d'avance.

Edit: J'ai essayé la suggestion ci-dessous, mais maintenant, je reçois l'erreur « ImportSomeStuff est inaccessible en raison de son niveau de protection » où je tente d'utiliser la struct. Tout semble être public, alors que puis-je essayer?

class ImportSomeStuff 
{ 
    [StructLayout(LayoutKind.Sequential)] 
    public struct MyStruct 
    { 
     public uint nData; 
    } 

    public delegate void MyCallback(ref MyStruct myStruct); 

    [DllImport("My.dll", CallingConvention = CallingConvention.Cdecl)] 
    [return: MarshalAs(UnmanagedType.I1)] 
    public static extern bool AddCallback(MyCallback callback); 

    [DllImport("My.dll", CallingConvention = CallingConvention.Cdecl)] 
    [return: MarshalAs(UnmanagedType.I1)] 
    public static extern bool RemoveCallback(MyCallback callback); 
} 

(fichier différent)

class DoSomeStuff 
{ 
    public List<ImportSomeStuff.MyStruct> listStuff = new List<ImportSomeStuff.MyStruct>(); 
} 

Répondre

3
public static class Native 
{ 
    [DllImport("nativelib.dll")] 
    public static extern int SomeFunction(); 
} 

Et vous pouvez appeler cette fonction de partout:

Native.SomeFunction(); 
+0

Merci. Mes fonctions utilisent également une structure que j'ai déclarée en C#, mais je reçois maintenant l'erreur "[class] est inaccessible en raison de son niveau de protection" où je l'utilise. Aucune suggestion? – parsley72

+0

@parsley puis rendre les structures publiques – CodesInChaos

+0

Elles sont - voir l'exemple de code ci-dessus. – parsley72

3

Ce sont des fonctions statiques, donc si vous les rendre publics, vous devriez être en mesure d'y accéder avec ClassName.FunctionName(). Enfin, c'est comme ça que vous le faites avec les fonctions C.

Mais en général, je ne fais pas mon truc Interop natif public. Je le garde interne dans mon assembly interop et j'écris dessus un wrapper public qui correspond mieux au style C#.

+0

Convenu. Je veux le faire quand j'ai plus de temps mais c'est juste essayer de le faire fonctionner! – parsley72