При нажатии на Сумма в примере ArbitraryMethod из Лекция 7, VS 2013 выдается ошибка: Необработанное исключение типа "System.InvalidOperationException" в System.Windows.Forms.dll Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "lblResult" не из того потока, в котором он был создан. Затем: Необработанное исключение типа "System.InvalidOperationException" в mscorlib.dll Дополнительные сведения: Для каждой асинхронной операции метод EndInvoke может вызываться только один раз. |
Использование библиотек кода в windows-формах
Приложение PDF Reader
В качестве примера вызова COM-компонент создадим приложение, позволяющее просматривать документы в формате PDF. Создайте новое Windows-приложение и назовите его PDF Reader. Добавляем на форму элементы OpenFileDialog и MainMenu. Устанавливаем следующие свойства формы:
В окне Toolbox щелкаем правой кнопкой на вкладке Windows Forms, и в появившемся контекстном меню выбираем Add/Remove Items… . В окне Customize Toolbox переключаемся на вкладку COM Components и ставим галочку в чекбоксе компонента Adobe Acrobat 7.0 Browser Document (рис. 5.11).
Этот компонент появляется после установки программы Adobe Acrobat Reader 7.0. Нажимаем ОК — в окне Toolbox появился новый элемент (рис. 5.12), перетаскиваем его на форму и устанавливаем свойству Dock значение Fill.
Добавляем обработчик пункта меню "Открыть":
private void mnuOpen_Click(object sender, System.EventArgs e) { openFileDialog1.Filter = "Файлы pdf|*.pdf"; openFileDialog1.ShowDialog(); axAcroPDF1.LoadFile(openFileDialog1.FileName); }
Запускаем приложения. При открытии документа в формате pdf происходит, по сути, встраивание в форму интерфейса программы Adobe Acrobat Reader (рис. 5.13):
На диске, прилагаемом к книге, вы найдете приложение PDF Reader. (Code\Glava5\PDF – Reader).
Генерирование сборок взаимодействия. Утилита tlbimp.exe
.NET-приложения могут использовать COM-классы с ранним или поздним связыванием. При использовании модели раннего связывания информация о типах должна быть известна на этапе компиляции. Для использования COM-типов в управляемом коде необходимо сгенерировать метаданные из библиотеки типов COM-компонента.
Библиотека описания типов COM-компонента может быть независимой от компонента и располагаться в файлах с расширением .tlb, .olb или .ocx. Также описание типов компонента может быть внедрено в качестве ресурса в .exe или .dll файл.
После обнаружения библиотеки описания типов COM-компонента можно приступить к генерации сборки, содержащей метаданные о типе. Это можно сделать с помощью утилиты tlbimp.exe (Type Library Importer). Для ее запуска выбираем Пуск\Все программы\ Microsoft Visual Studio .NET 2003 \ Visual Studio .NET Tools \ Visual Studio .NET 2003 Command Prompt и вводим название утилиты — tlbimp.exe. После генерации метаданных они сохраняются в виде обычной .NET-сборки. Такие сборки называются сборками взаимодействия, поскольку они включают в себя описание COM-компонента и не содержат кода. Утилита tlbimp.exe имеет следующий синтаксис:
Tlbimp TlbFile [/out: name] [/reference: file] [/silent] [/verbose] [/strictref] [/unsafe][ [/primary]][/publickey: file] [/keyfile: file][/keycontainer: name]
В таблице 5.4 представлено описание некоторых параметров утилиты:
Параметр | Описание |
---|---|
/out:filename | Указывает адрес, название сборки и пространство имен, содержащее метаданные |
/keyfile:filename | Параметры для генерирования сборки, подписанной строгим именем |
/reference:filename | Если компонент ссылается на внешние сборки, то с помощью этого аргумента можно указать адрес файла, в котором необходимо искать внешние типы |
/primary | Главная сборка взаимодействия для данного типа |
Например, для генерирования .NET-сборки myInteropassembly.dll на основании библиотеки activeds.tlb запускаем следующую строку в окне Visual Studio .NET 2003 Command Prompt:
tlbimp c:\Windows\system32\activeds.tlb /out: c:\myInteropassembly.dll
В результате на диске С появится сборка взаимодействия, которую можно будет использовать как частную или публичную (подробнее о сборке в "Создание пакетов установки" ).