Как создать многомерный Hashtable из COM (PDF) объектов в VB.Net - PullRequest
0 голосов
/ 13 февраля 2019

В настоящее время у меня есть функциональный код, который создает и изменяет объекты Nuance PDF, содержащиеся в Hashtable, где hashkey - выходной поток (строковое значение).К сожалению, когда каждый PDF-файл получает более 10 МБ или около того, слияние дополнительных PDF-файлов замедляет выполнение программы.

Я хотел бы добавить измерение в мою Hashtable, используя дополнительный целочисленный индекс, чтобы я мог простооткрывайте новый PDF-файл всякий раз, когда количество объединенных документов превышает значение из моего файла конфигурации.

Когда я инициализирую вложенный Hashtable, сначала все выглядит нормально.Я могу назначить ему объекты Nuance PDF.Однако, когда я пытаюсь получить доступ к одному из элементов PDF, TryCast не удается (ничего не возвращает).

Вот как я настроил первый экземпляр OutStream1 (OutStream1 - просто жестко заданный пример для упрощения - фактические выходные потоки считываются из файла конфигурации).

Моя цель - продолжать добавлять новые объекты PDF во внутренний Hashtable по мере необходимости при достижении порогового значения.

Dim pdfOutput As Hashtable = New Hashtable
Dim outTemp As Hashtable = New Hashtable
outTemp(0) = CreateObject("NuancePDF.DDDoc")
pdfOutput("OutStream1") = outTemp(0)

Когда все готово для манипулирования объектом PDF, назначение pdMrgDoc завершается неудачно.Без использования TryCast появляется сообщение об ошибке:

Невозможно привести объект COM типа 'System .__ ComObject' к типу класса 'System.Collections.Hashtable'.Экземпляры типов, которые представляют компоненты COM, не могут быть преобразованы в типы, которые не представляют компоненты COM;однако их можно приводить к интерфейсам, если базовый компонент COM поддерживает вызовы QueryInterface для IID интерфейса.

Dim pdMrgStream As Hashtable = pdfOutput("OutStream1")
Dim pdMrgDoc As New Object
pdMrgDoc = pdMrgStream(0)

Я не уверен, что означает это сообщение об ошибке.Есть ли способ, которым я могу сделать это?

1 Ответ

0 голосов
/ 15 февраля 2019

Я бы рекомендовал использовать типизированные контейнеры вместо устаревшего нетипизированного Hashtable.

Я не проверял это, но он должен работать так, как вы намереваетесь:

Dim pdfOutput As New Dictionary(Of String, Dictionary(Of Integer, Object))
Dim entry as New Dictionary(Of Integer, Object)

entry.Add(0, CreateObject("NuancePDF.DDDoc"))
pdfOutput.Add("OutStream1", entry)

Тогдакомпилятор будет отлавливать основные ошибки из-за ошибок типа во время компиляции, вместо того, чтобы ждать сбоя, пока не произойдет сбой приведения во время выполнения.

Вы также можете рассмотреть возможность инкапсуляции поведения в классе вместо хранения словаряи управление поведением снаружи.Это должно привести к получению более чистого и простого в обслуживании кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...