Псевдоним в объявлении функции перегружен?

У меня есть код VB6, который я конвертирую в VB.net и наткнулся на этот раздел

Declare Function TmSendByLen Lib "tmctl.dll"  Alias "TmSendByLength"(ByVal id As Integer, ByRef msg As Any, ByVal blen As Integer) As Integer
'snip'

Function TmSendByLength(ByVal id As Integer, ByVal msg As String, ByVal blen As Integer) As Integer
    TmSendByLength = TmSendByLen(id, msg, blen)
End Function

Раньше я не встречал термин Alias, но могу догадаться, что он делает. В чем я не уверен, так это в причинах перегрузки псевдонима. Если это то, что происходит.

Мне нужно создать перегрузки для функции TmSendByLen, поскольку «Как любой» не поддерживается в VB.net, поэтому я не уверен, следует ли мне просто удалить псевдоним или оставить его на месте.

Ответов (2)

Решение

Псевдоним не указывает, что функция точно перегружена, но что указанное имя действительно называется чем-то другим в вызываемой dll.

Поскольку ваш пример немного сбивает с толку (из-за повторяющихся имен), я воспользуюсь слегка измененной версией, чтобы объяснить:

Declare Function TmSendByLen Lib "tmctl.dll" Alias "TmSendByLength" (ByVal id As Integer, ByRef msg As Any, ByVal blen As Integer) As Integer)

Function InternalVersion(ByVal id As Integer, ByVal msg As String, ByVal blen As Integer) As Integer
    InternalVersion = TmSendByLen(id, msg, blen)
End Function

Итак, в этой модифицированной версии TmSendByLength имя - это то имя, в котором действительно вызывается точка входа указанной функции tmctl.dll . TmSendByLen это то, что мы называем в нашем коде, и InternalVersion это имя функции-оболочки.

Я бы предположил, что это так, чтобы его InternalVersion можно было вызывать в модулях / классах, в то время как TmSendByLen версия должна была быть частной.

Чтобы ответить на вторую часть вашего вопроса, псевдоним все еще доступен в VB.NET, хотя As Any и не доступен . (Вы можете найти информацию об этом здесь .) Хотите ли вы удалить псевдоним или нет, полностью зависит от вас, но в любом случае, я подозреваю, вам придется использовать As IntPtr (или SafeHandle) вместо As Any .

Ключевое слово «Alias» в VB6, вероятно, делает то, что вы думаете, однако именно имя функции в кавычках после ключевого слова «alias» является фактическим именем функции в DLL (например, TmSendByLength). Имя функции после части «Объявление функции» (например, TmSendByLen) фактически является псевдонимом, который будет использовать код VB6.

Как вы правильно указываете, VB6 не допускает тип параметра «Как любой», поэтому из исходного кода VB6, который вы опубликовали, разработчик объявил функцию VB6, которая, кстати, имеет то же имя, что и «настоящая» функция в DLL. , и изменил параметры этой функции, чтобы принимать только строковый тип для параметра «msg».

Код VB6 как есть на самом деле не перегружает какую-либо функцию, а, скорее, оборачивает функцию DLL в оболочку, специфичную для VB6, которая ограничивает тип параметра "msg".

В VB.NET, поскольку вы не можете указать «как любой», я считаю, что вы можете заменить это на «как объект», хотя это может быть не очень полезно, поскольку другой вызывающий код VB.NET может передавать этому параметру практически все, что угодно. Скорее всего, вам захочется создать настоящие перегруженные функции в VB.NET, где параметр «msg» отличается типом, который вы хотите принять. Таким образом, вы можете разрешить несколько разных типов, но при этом сохранить некоторые ограничения на то, какие типы могут быть переданы функции.

Вот пара ссылок, которые могут помочь:

VB6 "As Any" в VB.Net

PInvoke