Создание экземпляра класса взаимодействия COM

Я пытаюсь открыть CorelDRAW из своей программы с помощью С#. До сих пор я мог сделать это, сославшись на соответствующую библиотеку com и вызвав

CorelDRAW.Application draw = new CorelDRAW.Application();
draw.Visible = true; 

Однако я хотел бы, чтобы моя программа работала с любой версией CorelDRAW, которая поддерживает взаимодействие. Я пытаюсь использовать отражение для загрузки библиотеки взаимодействия во время выполнения, где конкретная dll может быть выбрана для правильной версии. Оглядываясь вокруг, я пробовал следующее.

string path = "Interop.CorelDRAW.dll";
Assembly u = Assembly.LoadFile(path);
Type testType = u.GetType("CorelDRAW.Application");

if (testType != null)
{
    object draw = u.CreateInstance("CorelDRAW.Application");

    FieldInfo fi = testType.GetField("Visible");
    fi.SetValue(draw, true);
}

Программа терпит неудачу в u.CreateInstance..., потому что CorelDRAW.Application — это интерфейс, а не класс. Я также попытался заменить CorelDRAW.Application на CorelDRAW.ApplicationClass, так как он доступен, когда я просматриваю Interop.CorelDRAW в качестве ресурса, но затем u.getType... не работает.

Как я могу заставить это работать? Благодарю вас!


person Ben Bartle    schedule 17.10.2012    source источник
comment
Я получил это работает в некоторой степени. Я создал 5 дополнительных проектов в своем решении C#, каждый из которых содержит ссылку на определенную версию Corel. Затем в этом проекте есть функция, которая возвращает мой объект CorelDRAW.Application. Затем я могу использовать отражение этого объекта в основной программе. Не самый чистый, но пока достаточный.   -  person Ben Bartle    schedule 19.10.2012


Ответы (2)


Вы можете создавать экземпляры зарегистрированных объектов ActiveX, используя следующую конструкцию:

Type type = Type.GetTypeFromProgID("CorelDRAW.Application", true);
object vc = Activator.CreateInstance(type);

Тогда у вас есть 3 варианта работы с возвращаемым объектом.

  1. Приведение возвращенного объекта к реальному интерфейсу CorelDRAW.Application, но для этого вам необходимо сослаться на какую-либо библиотеку CorelDraw, содержащую его, и, вероятно, это приведет к проблемам с версиями.

  2. Отражение, о котором вы упоминаете в своем вопросе.

  3. Используйте динамическое ключевое слово, чтобы вы могли вызывать существующие методы и свойства так же, как это было в реальном классе/интерфейсе CorelDraw.

    Type type = Type.GetTypeFromProgID("CorelDRAW.Application", true);
    dynamic vc = (dynamic)Activator.CreateInstance(type);
    vc.Visible = true;
    
person Alexander    schedule 22.03.2013

  System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFrom(fullPath);
  dynamic app = assembly.CreateInstance("CorelDRAW.ApplicationClass", true);

это сработает

person Mikhail Kislitsyn    schedule 12.11.2013