Lecture

Created: 31.10.2004 | Level: for all | Access: free | University: Московский государственный университет имени М.В.Ломоносова
Lecture 18:

C#. Отражения. Делегаты

< Lecture 17 || Lecture 18: 123 || Lecture 19 >

DLL-библиотеки

Для того чтобы вызвать метод из DLL-библиотеки, его следует объявить с модификатором extern и атрибутом DllImport.

Например:

[DllImport("Имя_библиотеки.dll")]
static extern int M1(int i1, string s1);

Класс атрибута DllImportAttribute имеет следующее определение:

namespace System.Runtime.InteropServices
{
  [AttributeUsage(AttributeTargets.Method)]
  public class DllImportAttribute: System.Attribute
  {
    public DllImportAttribute(string dllName) {...}
    public CallingConvention CallingConvention;
    public CharSet CharSet;      // Набор символов
    public string EntryPoint;    // Имя метода
    public bool ExactSpelling;    // Точное 
    // соответствие написания имени метода
    public bool PreserveSig;    // Определяет, будет ли 
    // предотвращено изменение сигнатуры метода  (по умолчанию
    // установлено значение true). 
    // При изменении сигнатуры возвращаемое  значение будет 
    // иметь тип HRESULT и будет добавлен out-параметр retval 
    public bool SetLastError;
    public string Value { get {...} }
  }
}

Атрибут DllImport имеет один позиционный параметр, определяющий имя DLL-библиотеки, и пять именованных параметров. Параметр EntryPoint позволяет указать имя метода из DLL-библиотеки. При этом имя метода, помечаемого данным атрибутом, может отличаться от имени метода в DLL-библиотеке.

Например:

[DllImport("myDll.dll", EntryPoint="M1")]
static extern int New_name_of_M1(int i1, string s1);

Именованный параметр CharSet определяет используемый в DLL-библиотеке набор символов (ANSI или Unicode). По умолчанию используется значение CharSet.Auto.

Например:

[DllImport("myDll.dll", CharSet CharSet.Ansi)]
static extern int M1(int i1, string s1);

Для каждого типа параметра при вызове метода из DLL-библиотеки выполняющая среда .NET производит подразумеваемое по умолчанию преобразование типов (например, тип string в тип LPSTR (Win32). Для того чтобы явным образом указать тип, используемый в методе DLL-библиотеки, следует применить к параметру атрибут MarshalAsAttribute.

Например:

[DllImport("myDll.dll", CharSet CharSet.Unicode)]
static extern int M1(int i1, 
      [MarshalAs(UnmanagedType.LPWStr)]
      string s1);

Атрибут MarshalAsAttribute может быть прикреплен к полю, методу или параметру. Прикрепление данного атрибута к методу позволяет указать явное преобразование типа для возвращаемого значения.

< Lecture 17 || Lecture 18: 123 || Lecture 19 >