2009-11-03 3 views
46

Мне нужно уточнение. У меня есть DLL Reportwriter, который использует Crystal Reports. Это написано на VB6. Я должен добавить эту DLL к моему проекту asp.net, где он создает dll interop.Что такое dll interop?

Насколько я понимаю, interple dll существует как посредник, так что мой код .net может разговаривать с DLL Reportwriter.

Так что я регистрирую dll interop или регистрирую исходную dll?

+0

+1 Я думаю, что это был хороший вопрос, даже если никто не проголосует за вас. :) – Dusty

ответ

85

Когда вы пишете код в VB6, скомпилированный результат является COM-компонентом. Компоненты COM предоставляют интерфейсы, соклассы, структуры и перечисления, которые обычно описываются с использованием библиотеки типа COM. Однако, чтобы потреблять этот COM-компонент в .NET, вам нужно ввести описание типа в формате, который понимает .NET, то есть сборке .NET (поскольку он не может напрямую работать с библиотеками типов). Таким образом, сборка interop представляет собой просто «преобразованную» библиотеку COM-типа, в которой она содержит описания интерфейсов, структур и т. Д., Которые соответствуют тем же вещам в библиотеке типов.

(Выше несколько упрощается, так как сборка Interop не имеют быть получены из библиотеки типов - вы можете вручную код один, если вы хотите, например.)

Вопреки тому, что является часто говорится, что сборник interop не содержит исполняемого кода, и он не выполняет сортировки. Он содержит только определения типов, и единственное место, где он может иметь методы, - это интерфейсы, а методы в интерфейсах не имеют реализации. Маршалинские вызовы .NET для COM-пакетов фактически выполняются самим CLR на основе описаний типов, загружаемых из сборников interop - он генерирует весь необходимый код «на лету».

Теперь, что касается вашего вопроса. Вам необходимо зарегистрировать COM-DLL (выход вашего VB6) - например, используя regsvr32.exe. Вы не должны (на самом деле, вы не можете) зарегистрировать сборку interop таким образом, потому что это не COM-компонент - это просто простая сборка .NET, поэтому вы можете либо поместить ее в ту же папку с вашим .exe/.dll , или поместить его в GAC, как обычно.

+0

Итак, как interop знает, где находится dll отчета, когда я вызываю его методы из моего .NET-кода? Переводит ли interop ключ в реестр? –

+1

Когда вы регистрируете свой COM-компонент, его местоположение записывается в реестр и может быть извлечено оттуда, если известен GUID компонента. Interop assembly знает GUID для typelib, из которого он был сгенерирован, и GUID для всех типов внутри этого typelib - они хранятся как атрибуты .NET. Затем среда выполнения будет использовать эту информацию для разрешения COM-компонента через реестр. –

2

Вы правы. Взаимодействие DLL завершает вызовы на компонент VB6 и делает их прозрачными.

При регистрации DLL на компьютере вы будете запускать приложение, вам все равно необходимо зарегистрировать DLL VB6. Взаимодействующая DLL будет сидеть в папке с папкой вашего приложения, а маршал - на вызовы.

2

Вы должны зарегистрировать свою библиотеку VB6 и указать ее в своем проекте .NET; эта ссылка создаст ваш Interop.dll