Построение ключей

При программировании в .NET ключи (открытый и закрытый) обычно создаются утилитой sn.exe, входящей в .NET SDK (сокращение «sn» означает «strong name», то есть «сильное имя»).

Ключи хранятся в двоичных файлах. Команда построения ключей имеет следующий синтаксис:

sn -k <имя_файла>

Файлам должно быть присвоено расширение .snk. В нашем примере пара ключей была создана командой

sn -k c:\keys\pair.snk

Файл .snk можно сгенерировать и в VS .NET IDE (команда Strong Name в диалоговом окне Project Properties), но большинство программистов предпочитает создавать ключи в отдельном процессе с максимальным уровнем защиты. Файл .snk должен быть защищен от несанкционированного доступа; если закрытый ключ станет известен посторонним, проку от него будет немного.

 

Сертификация сборки

При наличии пары ключей в виде файла .snk можно сертифицировать сборку закрытым ключом. При этом .NET включает открытый ключ в манифест сборки [ Точнее говоря, в манифест включается хэшированная версия ключа, которая в .NET называется образцом (token) открытого ключа. Вероятно, хэширование применяется для экономии места, хотя нам кажется, что в манифесте следовало бы просто опубликовать открытый ключ. ] и вычисляет хэш-код всех данных сборки по закрытому ключу. Результат тоже включается в манифест. По этим данным другие сборки, использующие ваш код, смогут убедиться в том, что сборка не подверглась постороннему вмешательству. Для этого открытый ключ применяется к зашифрованному хэш-коду, а результат сравнивается с приведенным в манифесте.

Чтобы сертифицировать сборку, включите в программу атрибут AssemblyKeyFile-Attribute с именем файла .snk после всех команд импортирования или же воспользуйтесь вкладкой Sharing диалогового окна Project Settings. Пример:

Imports System.Reflection

<Assembly:AssemblyKeyFi1eAttribute("c:\keys\pai r. snk")> \

Многие компании не предоставляют своим работникам доступа к закрытому ключу, поэтому в .NET была предусмотрена возможность отложить сертификацию сборки (за дополнительной информацией обращайтесь к документации).

 

COM Interop и вызовы функций DLL

Несмотря на появление .NET, существующий код на базе СОМ еще не собирается умирать. К счастью, уровень взаимодействия с СОМ в .NET работает очень хорошо. С другой стороны, использование СОМ в проектах .NET снижает быстродействие и затрудняет сопровождение программ, поэтому эти технологии объединяются лишь при крайней необходимости.

В Visual Studio .NET взаимодействие с СОМ почти не требует усилий со стороны программиста. Просто выберите нужный объект СОМ на вкладке СОМ диалогового окна ссылок, и с ним можно будет работать как с классом .NET. Для этого IDE читает библиотеку типов СОМ и создает для объекта вспомогательный класс («обертку») .NET. Открытыми членами этого класса являются все открытые члены объекта СОМ. Кстати, технология IntelliSense работает и для экземпляров этих классов.

Классы объектов СОМ также создаются утилитой tlbimp.exe, входящей в. NET SDK. В частности, эта утилита удобна при одновременном построении нескольких «оберток» для использования в будущем.

 

Вызовы функций DLL

Хотя при вызове функций DLL можно использовать старый синтаксис Declare, в .NET рекомендуется использовать другой способ — атрибут Oil 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 позволяет лучше управлять отдельными аспектами вызова. В частности, при вызове функции можно указать конвенцию передачи параметров, и кодировку для передачи строковых параметров.