Declare Statement
Объявляет ссылку на процедуру, реализованную во внешнем файле.
Синтаксис
[ <attributelist> ] [ accessmodifier ] [ Shadows ] [ Overloads ] _
Declare [ charsetmodifier ] [ Sub ] name Lib "libname" _
[ Alias "aliasname" ] [ ([ parameterlist ]) ]
' -or-
[ <attributelist> ] [ accessmodifier ] [ Shadows ] [ Overloads ] _
Declare [ charsetmodifier ] [ Function ] name Lib "libname" _
[ Alias "aliasname" ] [ ([ parameterlist ]) ] [ As returntype ]
Детали
Термин | Определение |
---|---|
attributelist |
Необязательно. См . список атрибутов. |
accessmodifier |
Необязательно. Может применяться один из перечисленных ниже типов. - Открытый - Protected - Friend - Частное - Protected Friend - Private Protected См. раздел Access levels in Visual Basic. |
Shadows |
Необязательно. См . тени. |
charsetmodifier |
Необязательно. Указывает набор символов и сведения о поиске файлов. Может применяться один из перечисленных ниже типов. - Ansi (по умолчанию) - Юникод - Автоматически |
Sub |
Необязательный, но Sub Function должен отображаться либо. Указывает, что внешняя процедура не возвращает значение. |
Function |
Необязательный, но Sub Function должен отображаться либо. Указывает, что внешняя процедура возвращает значение. |
name |
Обязательный. Имя этой внешней ссылки. Дополнительные сведения см. в разделе "Объявленные имена элементов". |
Lib |
Обязательный. Lib Представляет предложение, определяющее внешний файл (DLL или ресурс кода), содержащий внешнюю процедуру. |
libname |
Обязательный. Имя файла, содержащего объявленную процедуру. |
Alias |
Необязательно. Указывает, что объявленная процедура не может быть определена в файле по имени, указанному в name . Вы указываете его идентификацию в aliasname . |
aliasname |
Требуется, если вы используете Alias ключевое слово. Строка, определяющая процедуру одним из двух способов:Имя точки входа процедуры в файле в кавычках ( "" )–или– Числовой знак ( # ), за которым следует целое число, указывающее порядковое число точки входа процедуры в файле. |
parameterlist |
Требуется, если процедура принимает параметры. См . список параметров. |
returntype |
Обязательный параметр, если Function указан и Option Strict имеет значение On . Тип данных значения, возвращаемого процедурой. |
Замечания
Иногда необходимо вызвать процедуру, определенную в файле (например, библиотеке DLL или ресурсе кода) за пределами проекта. При этом компилятор Visual Basic не имеет доступа к информации, которую необходимо правильно вызвать процедуру, например, где находится процедура, как она определена, ее последовательность вызовов и тип возвращаемого значения, а также используется строковый символ. Оператор Declare
создает ссылку на внешнюю процедуру и предоставляет эти необходимые сведения.
Declare
можно использовать только на уровне модуля. Это означает, что контекст объявления для внешней ссылки должен быть классом, структурой или модулем и не может быть исходным файлом, пространством имен, интерфейсом, процедурой или блоком. Дополнительные сведения см. в разделе Контексты объявления и уровни доступа по умолчанию.
Внешние ссылки по умолчанию для общедоступного доступа. Уровни доступа можно настроить с помощью модификаторов доступа.
Правила
Атрибуты. Атрибуты можно применить к внешней ссылке. Любой атрибут, который вы применяете, действует только в проекте, а не во внешнем файле.
Модификаторы. Внешние процедуры неявно совместно используются. Вы не можете использовать
Shared
ключевое слово при объявлении внешней ссылки и изменить его общее состояние.Внешняя процедура не может участвовать в переопределении, реализации элементов интерфейса или обработке событий. Соответственно, нельзя использовать
Overrides
оператор ,Overridable
,NotOverridable
Implements
MustOverride
илиHandles
ключевое слово.Declare
Имя внешней процедуры. Вы не должны указывать эту внешнюю ссылку на то же имя (in
name
), что и имя точки входа процедуры в его внешнем файле (aliasname
). Предложение можно использоватьAlias
для указания имени точки входа. Это может быть полезно, если внешняя процедура имеет то же имя, что и зарезервированный модификатор Visual Basic или переменную, процедуру или любой другой элемент программирования в том же область.Примечание.
Имена точек входа в большинстве БИБЛИОТЕК DLL чувствительны к регистру.
Номер внешней процедуры. Кроме того, можно использовать
Alias
предложение, чтобы указать порядковое число точки входа в таблице экспорта внешнего файла. Для этого начнитеaliasname
с знака номера (#
). Это может быть полезно, если любой символ во внешнем имени процедуры не разрешен в Visual Basic или если внешний файл экспортирует процедуру без имени.
Правила типа данных
Типы данных параметров. Если
Option Strict
этоOn
так, необходимо указать тип данных каждого параметра вparameterlist
. Это может быть любой тип данных или имя перечисления, структуры, класса или интерфейса. В рамкахparameterlist
предложения вы используетеAs
предложение для указания типа данных аргумента, передаваемого каждому параметру.Примечание.
Если внешняя процедура не была написана для платформа .NET Framework, необходимо учесть соответствие типов данных. Например, если объявить внешнюю ссылку на процедуру Visual Basic 6.0 с
Integer
параметром (16 битов в Visual Basic 6.0), необходимо определить соответствующий аргумент, как вDeclare
инструкции, так какShort
это 16-разрядный целочисленный тип в Visual Basic.Long
Аналогично, имеет другую ширину данных в Visual Basic 6.0 иDate
реализуется по-разному.Возвращаемый тип данных. Если внешняя процедура является и является
Function
On
,Option Strict
необходимо указать тип данных значения, возвращаемого вызывающем коду. Это может быть любой тип данных или имя перечисления, структуры, класса или интерфейса.Примечание.
Компилятор Visual Basic не проверяет совместимость типов данных с внешними процедурами. Если имеется несоответствие, среда CLR создает MarshalDirectiveException исключение во время выполнения.
Типы данных по умолчанию. Если
Option Strict
заданOff
и не указан тип данных параметра вparameterlist
, компилятор Visual Basic преобразует соответствующий аргумент в тип данных объекта. Аналогичным образом, если не указатьreturntype
, компилятор принимает возвращаемый типObject
данных.Примечание.
Так как вы работаете с внешней процедурой, которая могла быть написана на другой платформе, это опасно сделать любые предположения о типах данных или разрешить им по умолчанию. При наличии гораздо безопаснее указать тип данных каждого параметра и возвращаемого значения. Это также повышает удобочитаемость кода.
Поведение
Область. Внешняя ссылка находится в область по всему классу, структуре или модулю.
Время существования. Внешняя ссылка имеет то же время существования, что и класс, структура или модуль, в котором он объявлен.
Вызов внешней процедуры. Вы вызываете внешнюю процедуру так же, как вызываете
Function
илиSub
процедуру, используя ее в выражении, если он возвращает значение или указывает его в операторе вызова, если он не возвращает значение.Аргументы передаются внешней процедуре точно так же, как указано
parameterlist
в инструкцииDeclare
. Не учитывайте, как параметры были первоначально объявлены во внешнем файле. Аналогичным образом, если имеется возвращаемое значение, используйте его точно так же, как указаноreturntype
в инструкцииDeclare
.Наборы символов. Вы можете указать
charsetmodifier
, как Visual Basic должен маршалировать строки при вызове внешней процедуры. МодификаторAnsi
направляет Visual Basic для маршалирования всех строк в значения ANSI, аUnicode
модификатор направляет его для маршалирования всех строк в значения Юникода. МодификаторAuto
направляет Visual Basic маршалировать строки в соответствии с правилами платформа .NET Framework на основе внешней ссылкиname
илиaliasname
, если он указан. Значение по умолчанию —Ansi
.charsetmodifier
также указывает, как Visual Basic должен искать внешнюю процедуру в его внешнем файле.Ansi
иUnicode
visual Basic, чтобы искать его, не изменяя его имя во время поиска.Auto
Позволяет Visual Basic определить базовый набор символов платформы времени выполнения и, возможно, изменить имя внешней процедуры следующим образом:На платформе Юникода, например Windows, сначала просмотрите внешнюю процедуру без изменения имени. Если это не удается, добавьте "W" в конец имени внешней процедуры и снова просмотрите его.
На платформе ANSI сначала просмотрите внешнюю процедуру без изменения имени. Если это не удается, добавьте "A" в конец имени внешней процедуры и снова просмотрите его.
Механизм. Visual Basic использует механизм вызова платформы платформа .NET Framework (PInvoke) для разрешения и доступа к внешним процедурам. Оператор
Declare
и DllImportAttribute класс используют этот механизм автоматически, и вам не требуется никаких знаний о PInvoke. Дополнительные сведения см. в пошаговом руководстве. Вызов API Windows.
Внимание
Если внешняя процедура выполняется вне среды CLR, это неуправляемый код. При вызове такой процедуры, например функции API Windows или метода COM, вы можете предоставить приложению риски безопасности. Дополнительные сведения см. в руководстве по безопасному коду для неуправляемого кода.
Пример 1
В следующем примере объявляется внешняя ссылка Function
на процедуру, возвращающую текущее имя пользователя. Затем он вызывает внешнюю процедуру GetUserNameA
в рамках getUser
процедуры.
Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (
ByVal lpBuffer As String, ByRef nSize As Integer) As Integer
Sub GetUser()
Dim buffer As String = New String(CChar(" "), 25)
Dim retVal As Integer = GetUserName(buffer, 25)
Dim userName As String = Strings.Left(buffer, InStr(buffer, Chr(0)) - 1)
MsgBox(userName)
End Sub
Пример 2
Предоставляет DllImportAttribute альтернативный способ использования функций в неуправляемом коде. В следующем примере объявляется импортированная функция без использования инструкции Declare
.
' Add an Imports statement at the top of the class, structure, or
' module that uses the DllImport attribute.
Imports System.Runtime.InteropServices
<DllImportAttribute("kernel32.dll", EntryPoint:="MoveFileW",
SetLastError:=True, CharSet:=CharSet.Unicode,
ExactSpelling:=True,
CallingConvention:=CallingConvention.StdCall)>
Public Shared Function MoveFile(ByVal src As String,
ByVal dst As String) As Boolean
' This function copies a file from the path src to the path dst.
' Leave this function empty. The DLLImport attribute forces calls
' to MoveFile to be forwarded to MoveFileW in KERNEL32.DLL.
End Function