|
Можно ли сдавать один и тот же тест несколько раз? |
C#. Отражения. Делегаты
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 может быть прикреплен к полю, методу или параметру. Прикрепление данного атрибута к методу позволяет указать явное преобразование типа для возвращаемого значения.