2010-06-02 6 views

Répondre

2

Voir l'exemple suivant tiré de la section Les délégués et les pointeurs de fonction non gérés de l'article Writing C# 2.0 Unsafe Code par Patrick Smacchia:

using System; 
using System.Runtime.InteropServices; 
class Program 
{ 
    internal delegate bool DelegBeep(uint iFreq, uint iDuration); 
    [DllImport("kernel32.dll")] 
    internal static extern IntPtr LoadLibrary(String dllname); 
    [DllImport("kernel32.dll")] 
    internal static extern IntPtr GetProcAddress(IntPtr hModule,String procName); 
    static void Main() 
    { 
      IntPtr kernel32 = LoadLibrary("Kernel32.dll"); 
      IntPtr procBeep = GetProcAddress(kernel32, "Beep"); 
      DelegBeep delegBeep = Marshal.GetDelegateForFunctionPointer(procBeep , typeof(DelegBeep)) as DelegBeep; 
      delegBeep(100,100); 
    } 
} 

Il y a aussi une autre méthode décrite par Junfeng Zhang, qui travaille également dans .NET 1.1:

Dynamic PInvoke

+0

Merci pour la réponse rapide! Votre méthode décrite pour appeler la fonction non managée résidant dans ".dll". Est-ce que la même méthode est valable pour les méthodes d'appel résidant dans ".exe" et ".lib"? – milan

0

Non

3

La réflexion fonctionne uniquement avec le code managé. En fonction du code non géré, vous pouvez utiliser COM interop (pour les composants com) ou PInvoke (pour les DLL de style ancien) pour appeler le code non managé. Peut-être que vous pouvez écrire un wrapper autour du code non managé pour rendre cela possible. Oui, dynamique P/Invoke est possible dans .NET en utilisant Marshal.GetDelegateForFunctionPointer.

+0

Ce n'est pas correct à 100%. La réflexion (au sens général décrit dans http://en.wikipedia.org/wiki/Reflection_%28computer_science%29) n'est pas limitée au code managé. –

+0

L'écriture autour du wrapper est exclue parce que la première n'a pas de code et la seconde, si elle va sans emballage ... on ne devrait pas emballer :) – milan

Questions connexes