Это не проблема .NET, это следствие того, как работает COM. Он не поддерживает наследование. Вы исправите это на стороне клиента, ему нужно вызвать QueryInterface () с IID для IBaseClass, чтобы получить указатель интерфейса на интерфейс IBaseClass, чтобы он мог вызвать GetA (). .NET interop автоматически обеспечивает реализацию QI, которая делает эту работу. Тем не менее, в этом случае он не очень удобен в использовании, разработайте свой код на C #, чтобы клиент мог легко использовать ваш класс, а не наоборот. Обычно вам нужен метод переопределения с одним слоем, который делегирует основную реализацию класса C #.
Обратите внимание, что есть проблема с сигнатурами вашего метода и использованием атрибута [PreserveSig]. Они не могут быть вызваны через IDispatch и не могут быть автоматически настроены. Для этого требуется метод с HRESULT в качестве типа возвращаемого значения. Это автоматически при удалении атрибута.
Вы можете использовать regexp парсер и форматировать события в JSON. Вот мой пример, где я читаю ввод из хвоста файла журнала (с тем же вводом, что и у вас) и вывод в stdout. Дайте мне знать.
<source>
@type tail
path /tailsource/t.log
pos_file /tailpos/t.log.pos
read_from_head true
tag temp
<parse>
@type regexp
expression /^(?<timestamp>.*?)\s\| (?<system>.*?)\s\| (?<module>.*?)\s\| (?<message>.*)$/
</parse>
</source>
<match>
@type stdout
</match>
Вот пример вывода -
{"timestamp": "2019-03-18 15: 56: 57.5522", "system": "HandFarm", "module": "ResolveDispatcher", "message": "начать разрешение msg: 8"}
blockquote>