Написание COM-объекта в C # и использование его из C # - PullRequest
4 голосов
/ 06 марта 2012

Я хотел бы реализовать COM-объект в C #, а также использовать его в C # (помимо C ++ и других).

Вот код библиотеки DLL, реализующей COM-объект:

namespace TestComServer {
  [ComVisible(true),
  Guid("565D8202-6C0F-4AAB-B0F6-49719CD13045"),
  InterfaceType(ComInterfaceType.InterfaceIsIUnknown)
  ]
  public interface ITestObject {
    void DoSomething();
  }

  [
  ComVisible(true),
  GuidAttribute("21293767-A713-49E2-968E-7DDE0B0DAB94"),
  ClassInterface(ClassInterfaceType.None)
  ]
  public class TestObject : ITestObject {
    public TestObject() {
    }

    public void DoSomething() {
    }
  }
}

Я использовал gacutil при добавлении DLL в глобальный кеш сборок.

EXE использует COM-объект следующим образом (как я успешно сделал с некоторыми COM-объектами, реализованными в C ++):

[
ComImport(),
Guid("565D8202-6C0F-4AAB-B0F6-49719CD13045"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)
]
public interface ITestObject {
  [PreserveSig ]
  void DoSomething();
}

[ComImport, Guid("21293767-A713-49E2-968E-7DDE0B0DAB94")]
public class TestObject {
}

private void button1_Click(object sender, EventArgs e) {
  object o = new TestObject();
  ITestObject t = (ITestObject)o;
  t.DoSomething();
}

При выполнении строки object o = new TestObject (); , я получаю InvalidCastException. Что не так с этим кодом?

Произошло необработанное исключение типа «System.InvalidCastException» в Test.exe Дополнительная информация: Das Objekt des Typs "TestComServer.TestObject" Канн Нихт в Типе "TestObject" umgewandelt werden.

1 Ответ

0 голосов
/ 07 марта 2012

Если вы измените EXE-файл, чтобы он импортировал только интерфейс, создайте экземпляр объекта с помощью Type.GetTypeFromCLSID и Activator.CreateInstance:

[
ComImport(),
Guid("565D8202-6C0F-4AAB-B0F6-49719CD13045"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)
]
public interface ITestObject {
  [PreserveSig ]
  void DoSomething();
}

private void button1_Click(object sender, EventArgs e) {
  Type type = Type.GetTypeFromCLSID(new Guid("21293767-A713-49E2-968E-7DDE0B0DAB94"));
  object o = Activator.CreateInstance(type);
  ITestObject t = (ITestObject)o;
  t.DoSomething();
}

Раньше я не использовал этот метод импорта объектов COM, поэтому это может не сработать. Обычно я определяю свои интерфейсы в отдельной сборке, которая также доступна для COM, на который ссылаются как DLL, так и EXE. EXE создает экземпляр библиотеки DLL с помощью вышеуказанного метода и преобразует ее в интерфейс .NET, на который он ссылается.

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