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