Ссылка на неуправляемые библиотеки из управляемого кода, преимущества и недостатки? - PullRequest
1 голос
/ 02 июля 2010

HI all,

Я хотел бы вызвать из моего кода C # неуправляемые библиотечные функции, как показано ниже.Есть два варианта, и оба работают.В данный момент функция «Beep» проста и не имеет никаких входных / выходных параметров, указателей, ссылок ... Мне интересно в более сложных случаях, каковы преимущества и недостатки обоих подходов?

Спасибо, Милан.

    [DllImport("kernel32.dll")]
    public static extern bool Beep(uint iFreq, uint iDuration);
    public void TestBeep()
    {
        Beep(300, 3000);
    }

    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);
    public void BeepIt()
    {
        IntPtr kernel32 = LoadLibrary("Kernel32.dll");
        IntPtr procBeep = GetProcAddress(kernel32, "Beep");
        DelegBeep delegBeep = Marshal.GetDelegateForFunctionPointer(procBeep, typeof(DelegBeep)) as DelegBeep;
        delegBeep(50, 1000);//Hz,ms
    }

Ответы [ 2 ]

3 голосов
/ 02 июля 2010

Ваш второй намного сложнее, чем первый, но в этом случае он достигает того же самого.

Если имя DLL и имя функции известны во время компиляции, тогда придерживайтесьПервый подход.Если вы не знаете имя DLL и / или функции до времени выполнения, то подход LoadLibary / GetProcAddress - ваш единственный вариант.

1 голос
/ 02 июля 2010

Маршаллер P / Invoke находит точку входа в DLL с помощью LoadLibrary () и GetProcAddress (). И знает, как преобразовать объявление C # в эквивалент объявления делегата.

Делать это самостоятельно не имеет никакого преимущества, кроме, может быть, крошечной эффективности. То, что вы должны измерить, это не slamdunk.

...