Matt T Heffron Ответов: 2

Как выставить синглтонный класс C# через COM


Я должен обеспечить функциональность, которая будет использоваться как новыми приложениями C#, так и устаревшим приложением C++ (VC6!!). Поэтому я планирую выставить интерфейсы через in-process COM. Одна из проблем заключается в том, что новая функциональность требует переноса некоторого состояния через использование этих COM-интерфейсов, хотя устаревшее приложение не имеет механизма передачи информации о состоянии.

Это анализ данных любить:

  1. Соберите справочные данные для калибровки. (наследие)
  2. Вычислительная калибровка. (legacy sw использует мой новый код)
  3. Соберите образцы данных. (наследие)
  4. Анализируйте с помощью калибровки. (legacy sw использует мой новый код)

Возможно повторите 3 и 4 для получения дополнительных выборочных данных.
Возможно повторять с 1-дополнительные наборы данных.

Устаревшее приложение - это стороннее приложение, для которого мы можем писать ограниченные Плагины C++. Все эти призывы независимы.

Все это происходит в рамках одного выполнения приложения, поэтому я подумал, что наличие одноэлементного класса "менеджер", который удерживает состояние во время выполнения приложения, должно препятствовать тому, чтобы что-то исчезло, пока нет ссылок COM.
Если это предположение неверно, пожалуйста дай мне знать!

Насколько я помню, нет COM-эквивалента вызова статического метода/свойства C# для получения одноэлементного экземпляра класса "менеджер".
(Или я ошибаюсь? Это было довольно давно со времен моего расцвета.)

Итак, вопрос в том, как мне обернуть интерфейс класса "менеджер" в C#, чтобы все CoCreateInstance() в C++ получить интерфейс к тому же" фактическому " экземпляру?
(То есть, шаги 2 и 4, выше, каждый вызовет CoCreateInstance() для интерфейса "менеджер" и вызовет Release() на этом интерфейсе.)

Конечно, будут рассмотрены предложения различных стратегий.

Что я уже пробовал:

Я очень хорошо знаком с созданием синглетного класса C#.
У меня также есть довольно недавний опыт работы с интерфейсами C# через COM.
Осложнение здесь-Синглтон.
Я еще не" пробовал " кодировать это.
Одна из моих мыслей была о взломе мета-класса, который мог бы быть CoCreateInstance()'ed и имел одно свойство, которое возвращало фактический интерфейс экземпляра singleton. (: большой палец вниз:)
Другой вариант состоял в том, чтобы Открытый класс COM реализовывал тот же интерфейс, что и синглтон, но все реализации методов и свойств просто вызывали функциональность на экземпляре синглтона.

Есть еще предложения?

0x01AA

Вы можете посмотреть здесь: Singleton + COM + C# (Страница 1) - .NET-Programmer & amp;#039;s Town[^] и найдите там "[Singleton, ComVisible (true)".

Я не читал его внимательно, но, похоже, это то, что вы ищете.

2 Ответов

Рейтинг:
8

Matt T Heffron

В конце концов я получил почти весь свой второй "вариант" выше:
Я смог перестроить код так, чтобы синглтонный класс не был нужен.
Вместо этого функциональность, требующая упорство был в состоянии быть перемещен в классы, выполняющие фактическую работу, и выставлен там как статические методы/свойства.
Класс com exposed теперь вызывает соответствующие статические методы/свойства для выполнения своей функциональности.
Для выполнения этой работы нет необходимости в двух версиях одного и того же класса, одной для COM и одной (синглтон).


Рейтинг:
2

KarstenK

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

Это сочетание именованный канал и Межпроцессная Коммуникация Используйте префикс" глобальный".

Я также могу вспомнить о более ранних временах, когда служба Windows был инструментом выбора для какой-то глобальной службы на машине.