Подключение графического COM к C # - PullRequest
2 голосов
/ 30 сентября 2019

Я пытался автоматизировать Grapher Golden Software (версия 15) с помощью C #. Руководство по программе на C ++ (однако файл выглядит старым, и я не уверен, что теперь оно применяется аналогичным образом) отмечает, что пользователь должен:

  1. Создать новый диалог AppWizardна основе приложения, используя все стандартные параметры.
  2. Измените основной ресурс диалога, чтобы он содержал желаемый пользовательский интерфейс. В этом примере кнопка «Выполнить и закрыть».
  3. Используйте мастер классов, чтобы добавить обработчик для кнопки «Выполнить».
  4. Запустите мастер классов, выберите «Добавить класс ...» из типаБиблиотека ...
  5. Библиотека типов Grapher содержится в файле grapher.tlb, поэтому выберите этот файл. Переименуйте классы по порядку: Документ, Рабочий лист, Приложение, Документы. Добавьте все классы.

Для меня это означало, что я пытался использовать ( после некоторого другого чтения ) команду tlbimp в приглашении разработчика, которую я использовал дляпереведите файл «grapher.tlb» в «GrapherTypeLib.dll». Далее я использовал regasm для регистрации этого файла (так как в некоторых местах , казалось, предполагал, что это необходимо).

Я добавил ссылку на GrapherTypeLib.dll в мой проект C # вместе с тем, чтобы он не вставлялся и имел локальную копию.

Однако с моим кодом:

using System;
using System.Data;

using GrapherTypeLib;

public class Grapher15
    {
        public Grapher15(Functions _function, string _data, DataTable _summary, IProgress<int> progress)
        {
            try
            {
                CreateProfiles(_data);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private void CreateProfiles(string _data)
        {
            // Create an instance which can work in the background
            IAppObject _instance = new ApplicationClass();
            _instance.Visible = true;
        }
    }

У меня всегда вылетает попытка создать приложение. Я должен отметить, что я пробовал различные варианты здесь, в том числе new Application(), которые приводят к одному и тому же:

System.Runtime.InteropServices.COMException: 'Получение фабрики класса COM для компонента с CLSID{41F3A3D2-EAF3-42F0-9F62-A6E55F08F7E7} не удалось из-за следующей ошибки: 80040154 Класс не зарегистрирован (исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)). '

На основании моих выше проверок и правилЯ бы подумал, что все прописано правильно. Я должен отметить, что когда это началось, я также переустановил программу, чтобы убедиться, что все регистрации были выполнены правильно. Тем не менее, я тогда решил проверить regedit, и на самом деле, похоже, нет того CLSID, который он ищет:

enter image description here

Я начал расследование иИспользуя ildasm, я обнаружил, что этот GUID соответствует значению реестра для GrapherTypeLib.ApplicationClass, которое, по-видимому, не зарегистрировано в списке regid. В то же время, ildasm отмечает, например, значение, отличное от GrapherTypeLib.Application, от значения, указанного в приведенном выше списке regid.

Итак, для краткого заключения - кто-нибудь имеет представление о том, чточто-то не так?

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