COM Interop и вызовы функций DLL. Вызовы функций DLL.
Несмотря на появление .NET, существующий код на базе СОМ еще не собирается умирать. К счастью, уровень взаимодействия с СОМ в .NET работает очень хорошо. С другой стороны, использование СОМ в проектах .NET снижает быстродействие и затрудняет сопровождение программ, поэтому эти технологии объединяются лишь при крайней необходимости.
В Visual Studio .NET взаимодействие с СОМ почти не требует усилий со стороны программиста. Просто выберите нужный объект СОМ на вкладке СОМ диалогового окна ссылок, и с ним можно будет работать как с классом .NET. Для этого IDE читает библиотеку типов СОМ и создает для объекта вспомогательный класс ("обертку") .NET. Открытыми членами этого класса являются все открытые члены объекта СОМ. Кстати, технология IntelliSense работает и для экземпляров этих классов.
Примечание
Классы объектов СОМ также создаются утилитой tlbimp.exe, входящей в .NET SDK. В частности, эта утилита удобна при одновременном построении нескольких "оберток" для использования в будущем.
Вызовы функций DLL
Хотя при вызове функций DLL можно использовать старый синтаксис Declare, в .NET рекомендуется использовать другой способ – атрибут Dll Import, позволяющий создавать общие точки входа. Для этого в программе определяется пустая функция, совпадающая по сигнатуре с вызываемой функцией. Ниже приведен пример использования атрибута Dll Import.
Imports System.Drawing Imports System.Runtime.InteropServices Module Modulel ' Импортировать функцию CreateDC из Win32 API <Dll Import("gdi32.dll")> Public Function CreateDC(ByVal strDhver _ As String. ByVal strDeviceName As String,_ ByVal strOutput As String. ByVal nullDEVICE As Integer _) As 'IntPtr End Function Sub Main() ' Создать прямоугольник Dim rctWindow As Rectangle = New Rectangle(100, 100, 200, 200) Dim penBlack As Pen = New PerUColor.Black) penBlack.Brush = Brushes.DarkKham Dim grfx As Graphics Dim hDC As IntPtr = CreateDC("DISPLAY" .vbNullString, vbNullString .vbNullString) grfx = Graphics.FromHdc(hDC) Do While (True) grfx.FillRectangle(penBlack.Brush, rctWindow) System.Threading.Thread.Sleep(0) Loop End Sub End Module
Другое принципиальное отличие атрибута Dll Import от ключевого слова Declare заключается в том, что Dll Import позволяет лучше управлять отдельными аспектами вызова. В частности, при вызове функции можно указать конвенцию передачи параметров, и кодировку для передачи строковых параметров.