2013-02-15 5 views
0

Когда я пытаюсь конвертировать HTML в XHTML тегов я получаю следующее сообщение об ошибке ...В C# при использовании Interop HTML XHTML 2 Lib Dll Исходный код Давать Ошибка

Error: Retrieving the COM class factory for component with CLSID {59939390-0E6A-4F1B-A742-20C5459501F7} failed due to the following error: 80040154.

После прибегая к помощи я нашел несколько решений :

Registering the DLL into regsvr32 "E:Source Code\bin\Interop.HTML2XHTMLLib.dll"

Я просто пытался зарегистрировать DLL. Но был загружен E:Source Code\bin\Interop.HTML2XHTMLLib.dll. Но точка входа DllRegisterServer не была обнаружена, это сообщение об ошибке было отображено. Зачем..?

Перекомпилирован мой проект для x86 и x64 .. нет использование ..

VB.NET Код:

Dim xhtmlUtil As New XHTMLUtilities // Here itself im getting the above error. 

sFormattedOutput = xhtmlUtil.convertToXHTML(sInputline) //Send it for conversion 

Моя операционная система Windows XP 32-разрядная версия пакета обновления 3. Мое приложение было сделано в VS2008. в настоящее время я работаю с VS2010.

Вот что мне не хватает. Может ли кто-нибудь помочь мне разобраться в этой проблеме?

Заранее спасибо.

+0

Если это сборка .NET, вы пробовали regasm вместо regsvr? –

+0

Вы пытались добавить HTML2XHTML через NuGet вместо этого? –

+0

@NickGotch как я могу попробовать с regasm. вы можете предоставить настройки. – RajeshKdev

ответ

4

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.

Для этого у вас есть два варианта:

  1. НАЙДИТЕ redistributeable пакет, который содержит библиотеку и установить его вместе с приложением.
  2. В вашей системе разработки откройте диалоговое окно «Добавить ссылки» в 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) состоит из двух частей:

  1. Тип библиотеки (.tlb), который содержит мета-информацию о сервере, это содержащиеся объекты и их Как добираться.
  2. Библиотека, содержащая код, в котором реализованы все объекты. Кроме того, библиотека экспортирует следующие статические функции:
    • DllGetClassObject – пытается создать экземпляр объекта, определенный внутри сервера
    • DllCanUnloadNow – Сообщает COM среды, независимо от того или нет сервер может быть освобожден, потому что ISN больше не используется никаким другим процессом.
    • DllRegisterServerregsvr32 Для регистрации ранее упомянутой библиотеки типов в реестре 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.

+0

+1 спасибо за ваш ответ @Aschratt. – RajeshKdev