2016-03-14 1 views
0

Le System.Windows.Forms.dllJe souhaite envelopper une DLL dans C#

Je voudrais envelopper quelques fonctions dans ce fichier dans une classe C#.

Plus précisément ces: https://msdn.microsoft.com/en-us/library/system.windows.forms.cursor(v=vs.110).aspx

Mais je ne suis pas sûr de savoir comment obtenir une liste des fonctions. J'ai essayé des programmes qui n'ont donné aucun résultat. Je me demandais si quelqu'un pourrait me donner 1 et 1 seul exemple?

Ceci, par exemple, renvoie un EntryPointNotFoundException

[DllImport("System.Windows.Forms.dll")] 
public static extern void SetCursor(String s); 
+0

http://www.pinvoke.net/search.aspx?search=SetCursor&namespace=[Tous] –

Répondre

0

D'abord, vous devez activer les services Interop afin d'appeler en fonctions des fenêtres:

using System.Runtime.InteropServices; 

Ensuite, vous déclarez simplement les méthodes vous souhaitez importer en tant que tel:

[DllImport("winmm.dll")] 
public static extern bool PlaySound(string filename,long hmodule, int dword); 

Ceci crée un "mappin" g » à la méthode PlaySound dans le winmm.dll non géré La méthode est créée comme statique et l'utilisation des mots-clés externat indique la compilar que la méthode est externe à votre classe (ne fonctionne pas à l'intérieur)

+0

Il vient de modifier le post, j'obtiens une EntryPointNotFoundException. En outre, l'ouverture de la DLL avec dll exportateur ou dépend spectateur, ne montre rien. –

+0

Vous n'obtiendrez pas IntelliSense à partir de C# et de bibliothèques gérées. Vous devez ajouter explicitement la signature de méthode à chaque méthode que vous voulez utiliser, vous les trouverez dans la documentation que vous avez liée. Entrypoint not found signifie que la DLL n'est pas dans le chemin d'accès du programme, vous devrez peut-être modifier un peu. –

0

pour obtenir la liste/recherche de fonctions non managées vous pouvez utiliser

http://www.pinvoke.net

par exemple, pour SetCursor vous pouvez appeler

http://www.pinvoke.net/search.aspx?search=SetCursor&namespace=[All]

E.g. pour placer le curseur à une position fournie SetCursorPos vous pouvez faire

using System.Runtime.InteropServices; 

... 

// Wrapper 
class CursorNativeMethods { 
    [DllImport("User32.dll", 
      EntryPoint = "SetCursorPos", 
      CallingConvention = CallingConvention.Winapi)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    internal static extern Boolean SetCursorPos(Point point); 
    ... 
    [DllImport("User32.dll", 
      EntryPoint = "GetCursorPos", 
      CallingConvention = CallingConvention.Winapi)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    internal static extern Boolean GetCursorPos([Out] out Point point); 
    ... 
} 

// Your Routine 
public static class MyCursor { 
    public Point Location { 
    get { 
     Point pt = new Point(-1, -1); 

     if (CursorNativeMethods.GetCursorPos(out pt)) 
     return pt; 
     else 
     return new Point(-1, -1); 
    } 
    set { 
     CursorNativeMethods.SetCursorPos(value); 
    } 
    } 
    ... 
} 

S'il vous plaît noter que System.Windows.Forms.dll est assemblage géré (vous ne devriez pas interop avec), et User32.dll est bibliothèque non géré.

+0

https://www.assetstore.unity3d.com/fr/#!/content/17177 J'essaye de recréer cela. Je ne sais pas pourquoi il utilise Windows.Forms. si je ne devrais pas? –

+0

@Tristan Patrick Richter: vous ne devriez pas * interopérer * avec 'System.Windows.Forms.dll', mais vous pouvez utiliser l'assembly ainsi que n'importe quel espace de noms/classe, etc. (par exemple' Windows.Forms'). –

+0

Je vois. Seriez-vous capable de connaître la meilleure façon de geler un curseur, comme c'est le cas dans les MMORPG où vous maintenez le bouton droit de la souris et faites le glisser? –