На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: maxim84_
  
> Динамическая загрузка неуправляемой DLL
    DLL (создана в Delphi):
    ExpandedWrap disabled
      library NativeDLL;
       
      {$R *.res}
       
      function GetSomeString: PChar;
      begin
        Result := 'String from native DLL';
      end;
       
      exports
        GetSomeString;
       
      begin
      end.

    Вызов из программы на C#:
    ExpandedWrap disabled
      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);
          }
      }
    Сообщение отредактировано: 2005fs -
    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script execution time: 0,0527 ]   [ 15 queries used ]   [ Generated: 27.04.24, 03:30 GMT ]