Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > .NET FAQ > Динамическая загрузка неуправляемой DLL


Автор: 2005fs 29.07.07, 23:29
DLL (создана в Delphi):
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    library NativeDLL;
     
    {$R *.res}
     
    function GetSomeString: PChar;
    begin
      Result := 'String from native DLL';
    end;
     
    exports
      GetSomeString;
     
    begin
    end.

Вызов из программы на C#:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    using System;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;//  Это необходимо добавить
     
    namespace LoadingNativeDll
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                //  Открываем DLL, получаем ее Handle
                IntPtr hExe = Imports.LoadLibrary("NativeDLL.dll");
                //  Получаем адрес функции, експортируемой DLL
                IntPtr NativeFunction = Imports.GetProcAddress(hExe, "GetSomeString");
     
                //  Используя маршалинг, приводим неуправляемую функцию к делегату
                NativeInvoker nativeInvoker = Marshal.GetDelegateForFunctionPointer(NativeFunction, typeof(NativeInvoker)) as NativeInvoker;
                //  Получаем значение експортируемой функции, используя объект делегата
                string importedString = nativeInvoker();
     
                //  Освобождаем ресурсы
                Imports.FreeLibrary(hExe);
     
                //  Выводим значение, полученное из DLL
                MessageBox.Show(importedString);
            }
        }
     
        //  Объявляем делегат, к которому будет приводиться нужная неуправляемая функция
        public delegate string NativeInvoker();
     
        /// <summary>
        /// Импорт необходимых функций Windows API
        /// Смотрите также документацию по атрибуту DllImportAttribute
        /// http://msdn.microsoft.com/library/rus/default.asp?url=/library/rus/cpref/html/frlrfsystemruntimeinteropservicesdllimportattributememberstopic.asp
        /// </summary>
        public class Imports
        {
            [DllImport("kernel32.dll")]
            public static extern IntPtr LoadLibrary(string lpFileName);
     
            [DllImport("kernel32.dll", CharSet = CharSet.Ansi, ExactSpelling = true)]
            public static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
     
            [DllImport("kernel32.dll", SetLastError = true)]
            public static extern bool FreeLibrary(IntPtr hModule);
        }
    }

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)