Как выставить синглтонный класс C# через COM
Я должен обеспечить функциональность, которая будет использоваться как новыми приложениями C#, так и устаревшим приложением C++ (VC6!!). Поэтому я планирую выставить интерфейсы через in-process COM. Одна из проблем заключается в том, что новая функциональность требует переноса некоторого состояния через использование этих COM-интерфейсов, хотя устаревшее приложение не имеет механизма передачи информации о состоянии.
Это анализ данных любить:
- Соберите справочные данные для калибровки. (наследие)
- Вычислительная калибровка. (legacy sw использует мой новый код)
- Соберите образцы данных. (наследие)
- Анализируйте с помощью калибровки. (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)".
Я не читал его внимательно, но, похоже, это то, что вы ищете.