Московский государственный университет имени М.В.Ломоносова
Опубликован: 01.11.2004 | Доступ: свободный | Студентов: 11275 / 456 | Оценка: 4.12 / 4.01 | Длительность: 19:20:00
ISBN: 978-5-9556-0077-9
Специальности: Программист
Лекция 18:

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

< Лекция 17 || Лекция 18: 123 || Лекция 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 может быть прикреплен к полю, методу или параметру. Прикрепление данного атрибута к методу позволяет указать явное преобразование типа для возвращаемого значения.

< Лекция 17 || Лекция 18: 123 || Лекция 19 >
Александр Демьяненко
Александр Демьяненко

Можно ли сдавать один и тот же тест несколько раз?
Или же один и тот же тест можно сдать лишь однажды?

Максим Стогний
Максим Стогний

Добрый день!

Скажите, пожалуйста, если в терминологии объектно-ориентированного программирования функции также называются методами или методами - членами класса, в примере объявления указателя на метод использовали в формальном описании оба названия:

тип_метода (имя_класса::*имя_метода_указателя)
    (список параметров);
тип_функции (*имя_ функции_указателя)
    (список параметров);

при этом можно было  тип_функции во втором описании заменить на тип_метода? Т.е.:

тип_метода (*имя_ метода_указателя)
    (список параметров);