Declare Or DllImport?

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Declare Or DllImport?

Сообщение Viper » 14.02.2006 (Вт) 14:04

Собственно сабж. Чем с точки зрения высоких материй отличается юзанье API-функций при помощи старого, проверенного Declare от новомодной и ненавязчиво рекламируемой Microsoft'ом методы с использованием атрибута DllImport?

В чем состоит различие этих методов? Скорость, использование памяти, что-то еще?

Или может быть ситуация аналогична различию между Declare и использованием библиотек типов?
Весь мир матрица, а мы в нем потоки байтов!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Declare Or DllImport?

Сообщение tyomitch » 14.02.2006 (Вт) 14:31

!Viper! писал(а):Или может быть ситуация аналогична различию между Declare и использованием библиотек типов?

Имхо в точности так (хотя я не поручусь).
Изображение

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 14.02.2006 (Вт) 15:43

Значит мыслю в нужном направлении...
Весь мир матрица, а мы в нем потоки байтов!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.02.2006 (Вт) 16:00

Я думаю, что с точки зрения высоких материй declare сохранена для удобства привыкших к 6, а компилятор всё равно сделает один и тот же IL...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.02.2006 (Ср) 0:05

GSerg писал(а):Я думаю, что с точки зрения высоких материй declare сохранена для удобства привыкших к 6, а компилятор всё равно сделает один и тот же IL...

Следственный эксперимент:
Код: Выделить всё
Imports System.Runtime.InteropServices

Module Module1
    <DllImport("user32.dll", CharSet:=CharSet.Ansi, EntryPoint:="MessageBoxA")> _
    Private Function MessageBox1(ByVal hWnd As IntPtr, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Integer) As Integer
    End Function

    Private Declare Function MessageBox2 Lib "user32" Alias "MessageBoxA" (ByVal hWnd As IntPtr, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Integer) As Integer

    Sub Main()
        MessageBox1(IntPtr.Zero, "With DllImport", "MessageBox", 0)
        MessageBox2(IntPtr.Zero, "With Declare", "MessageBox", 0)
    End Sub
End Module


Результат:
Код: Выделить всё
.method private static pinvokeimpl("user32.dll" as "MessageBoxA" ansi winapi)
        int32  MessageBox1(native int hWnd,
                           string lpText,
                           string lpCaption,
                           int32 wType) cil managed preservesig
{
}

.method private static pinvokeimpl("user32" as "MessageBoxA" nomangle ansi lasterr winapi)
        int32  MessageBox2(native int hWnd,
                           string&  marshal( byvalstr) lpText,
                           string&  marshal( byvalstr) lpCaption,
                           int32 wType) cil managed preservesig
{
}

.method public static void  Main() cil managed
{
  .entrypoint
  .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
  // Code size       51 (0x33)
  .maxstack  4
  .locals init (string V_0,
           string V_1)
  IL_0000:  ldsfld     native int [mscorlib]System.IntPtr::Zero
  IL_0005:  ldstr      "With DllImport"
  IL_000a:  ldstr      "MessageBox"
  IL_000f:  ldc.i4.0
  IL_0010:  call       int32 ConsoleApplication1.Module1::MessageBox1(native int,
                                                                      string,
                                                                      string,
                                                                      int32)
  IL_0015:  pop
  IL_0016:  ldsfld     native int [mscorlib]System.IntPtr::Zero
  IL_001b:  ldstr      "With Declare"
  IL_0020:  stloc.1
  IL_0021:  ldloca.s   V_1
  IL_0023:  ldstr      "MessageBox"
  IL_0028:  stloc.0
  IL_0029:  ldloca.s   V_0
  IL_002b:  ldc.i4.0
  IL_002c:  call       int32 ConsoleApplication1.Module1::MessageBox2(native int,
                                                                      string&,
                                                                      string&,
                                                                      int32)
  IL_0031:  pop
  IL_0032:  ret
} // end of method Module1::Main



Как легко видеть, получается далеко не одно и то же...
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.02.2006 (Ср) 4:33

Не вижу особой разницы...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 15.02.2006 (Ср) 10:47

А в Declare атрибутить мона?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.02.2006 (Ср) 11:07

Мона... маршалинг указывать...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 15.02.2006 (Ср) 12:17

Следственный эксперимент показал, что если в Declare указать вс нужные атрибуты (как передавать строки, структуры и т.д.), то мы получим абсолютно идентичные вызовы функций через Declare и DllImport. Если же понадеяться на передачу параметров по умолчанию, то вызов через Declare будет выглядеть как в примере tyomitch. Вызов же при помощи DllImport никогда никаких дополнительных преобразований не делает - просто осуществляется вызов.
Весь мир матрица, а мы в нем потоки байтов!


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20

    TopList