i'm just tried to register the dll. But E:Source Code\bin\Interop.HTML2XHTMLLib.dll was loaded. But the DllRegisterServer entry point was not found this error message was displayed. why?
Interop .HTML2XHTMLLib.dll файл не является библиотекой вы хотите зарегистрировать с помощью regsvr32. Это только управляемая сборка interop, созданная для COM-объектов, доступных для вашего приложения .NET. Вам действительно нужно зарегистрировать библиотеку типов для HTML2XHTMLLib.dll.
Для этого у вас есть два варианта:
- НАЙДИТЕ redistributeable пакет, который содержит библиотеку и установить его вместе с приложением.
- В вашей системе разработки откройте диалоговое окно «Добавить ссылки» в Visual Studio. Выберите вкладку COM и найдите библиотеку (как и при добавлении ссылки). Там вы найдете абсолютный путь к библиотеке. Скопируйте библиотеку в клиентскую систему и зарегистрируйте ее с помощью
regsvr32
.
Поскольку я не знаю источник HTML2XHTMLLib, я могу только предложить эти способы. Вы должны предпочесть первый.
Поскольку вы начали щедрость на этом, я хочу немного подробнее остановиться на COM и InterOp.
Различия между COM и .NET сборок
Есть два типа серверов в COM: InProc-серверы и OutProc-серверов. InProc (in Process) являются серверами, которые мы обычно знаем als DLL. Серверы OutProc (Out of Process) стоят в одиночестве и работают в своем собственном процессе. Мы знаем их как EXE cutables.
Вы хотите использовать InProc-сервер.Ваш COM-сервер (HTML2XHTMLLib) состоит из двух частей:
- Тип библиотеки (
.tlb
), который содержит мета-информацию о сервере, это содержащиеся объекты и их Как добираться.
- Библиотека, содержащая код, в котором реализованы все объекты. Кроме того, библиотека экспортирует следующие статические функции:
DllGetClassObject
– пытается создать экземпляр объекта, определенный внутри сервера
DllCanUnloadNow
– Сообщает COM среды, независимо от того или нет сервер может быть освобожден, потому что ISN больше не используется никаким другим процессом.
DllRegisterServer
– regsvr32
Для регистрации ранее упомянутой библиотеки типов в реестре Windows, чтобы сделать ее видимой для клиентов и среды COM.
DllUnregisterServer
– Выполняется полная противоположность при вызове через regsvr32 -u
.
Библиотека типов может также ресурс DLL или EXE-файла, так что есть только один файл. Для разработчиков C# это кажется чем-то запутанным, поскольку метаинформация напрямую компилируется в сборку .NET и доступна через отражение.
InterOp: Оболочка между .NET и COM
библиотек Так Основном типа описывают все, что необходимо в .NET отражения для доступа к объектам экспонируют через COM. Но проблема в том, что COM-компоненты хранятся в другом формате:
- Обычно они непосредственно компилируется в машинный код: Вы не можете связать сборки .NET, скомпилированные с AnyCPU против COM-сервера. COM-серверы напрямую скомпилированы либо для x86-ассемблера, либо для x86-64-ассемблера. Они имеют фиксированные размеры указателя и, таким образом, совместимы только с одной из компиляционных моделей.
- COM определяет правила управления памятью. Каждый COM-объект должен реализовать интерфейс
IUnknown
. Этот интерфейс определяет три метода. Методы AddRef
и Release
предназначены для управления памятью. Всякий раз, когда клиент обращается к COM-объекту, ему нужно позвонить AddRef
. Это увеличивает счетчик на единицу. Когда клиенту больше не нужен объект, он вызывает Release
вместо удаления объекта, что приводит к уменьшению счетчика. Если указатель достигает 0, сам объект удаляется. Это отличается от того, как .NET управляет памятью. В .NET сборщик мусора посещает каждый объект в куче недетерминированным способом (вы не можете определить точный момент времени, когда объект get удаляется) и освобождает объект, когда на него нет ссылок.
- COM определяет правила идентификации. Всякий раз, когда вы хотите получить доступ к базовому интерфейсу объекта, вы должны вызвать метод
QueryInterface
, определенный IUnknown
. Этот метод гарантированно всегда возвращает один и тот же указатель, когда запрашивается конкретный интерфейс. Это может быть справедливо и для .NET (помимо вас есть overloading some operators), но способ .NET гарантирует идентичность объекта.
- COM определяет правила для объектных отношений. Сумасшедшие вещи, такие как Aggregation и Containment, которые также существуют в .NET, но реализованы по-разному.
- COM определяет различные правила многопоточности, такие как Single Threaded Appartments и Multi Threaded Appartments. Эти модели потоков определяют, как взаимодействуют объекты, когда они сосуществуют разными способами. В .NET вы должны выполнить каждый процесс синхронизации вручную.
Этот список может быть неполным, и я не хочу подробно останавливаться на нем, поскольку это относится только к вашему вопросу, но вы видите, что между .NET и COM существуют некоторые большие различия. И для управления этими различиями существует слой между обоими мирами: COM InterOp.
Если вы вызываете COM-сервер из .NET, InterOp представляет собой не что иное, как сборку .NET., что делает всю тяжелую работу под капотом. Он создается с помощью инструмента tlbimp.exe. Visual Studio обычно вызывает его для вас всякий раз, когда вы ссылаетесь на библиотеку со вкладки COM. В результате получим библиотеку, которую вы хотите зарегистрировать: InterOp.Libary.dll. Эта библиотека переопределяет все типы библиотеки типов COM-сервера, реализует правила, требуемые COM, и выполняет фактические вызовы для вас. Однако это управляемая библиотека .NET, которая не определяет методы, описанные ранее. Вот почему regsvr32
не может найти точку входа DllRegisterServer
.
Способ, описанный выше, является только односторонним с неуправляемым COM-сервером и управляемым .NET-клиентом. Есть и другой способ, с контрагентами tlbexp.exe и regasm
.
Если это сборка .NET, вы пробовали regasm вместо regsvr? –
Вы пытались добавить HTML2XHTML через NuGet вместо этого? –
@NickGotch как я могу попробовать с regasm. вы можете предоставить настройки. – RajeshKdev