. NET перехватить вызов метода COM - PullRequest
0 голосов
/ 21 февраля 2020

Прежде чем написать это, я просмотрел более 10 вопросов по этой теме c, чтобы убедиться, что я не пропускаю что-то очевидное, но я не смог найти ответы на этот конкретный c сценарий.

Я работаю над корпоративным продуктом, который (к сожалению) унаследовал некоторый старый код VB6, который до сих пор используется в нескольких частях системы. В настоящее время я занимаюсь анализом того, как наилучшим образом определить, какая часть этого кода VB6 фактически используется, чтобы компания могла ориентироваться на стратегический c переход на. NET. У меня возникла следующая идея:

В местах, где используется код VB6, типичный код, который его вызывает (VB. NET), выглядит следующим образом:

Dim myComObject = Server.CreateObject("MyCOMObject")
With myComObject
    .MyCOMProperty = ""
    .MyCOMMethod()
End with

Моя идея состоит в том, чтобы создать фасад. NET, за которым можно скрыть весь код, который вызывает COM, и вызывать абстракцию фасада во всех местах, где в данный момент вызывается код COM. Другими словами:

public interface ICOMFacade 
{
    public object CreateCOMObject(string comObject)
}

...

Dim myComObject = comFacade.CreateCOMObject("MyCOMObject")
With myComObject
    .MyCOMProperty = ""
    .MyCOMMethod()
End with

Реализация CreateCOMObject будет внутренне вызывать Server.CreateObject (comObject), но также будет регистрировать этот вызов в базе данных. Таким образом, я мог бы проанализировать все вызовы ко всем COM-объектам и понять, что используется, а что нет. Однако этого недостаточно. Мне также нужно понять, какие методы и свойства вызываются из объектов COM. По этой причине мне нужно понять, существует ли способ, которым можно перехватить каждый вызов метода и свойство COM-объекта.

Спасибо.

1 Ответ

1 голос
/ 21 февраля 2020

Как пишет Саймон Мурье, нет, для COM-методов нет встроенного механизма перехвата, они (и свойства тоже) просто переходят по адресам, управляемым в таблицах виртуальных методов.

Возможно, некоторые попытки пишут код, который с помощью Reflection проверяет классы COM и генерирует некоторые классы-оболочки. NET либо в памяти (Reflection.Emit), либо путем генерации C# кода. Чем использовать эти классы вместо оригинальных. Но это долгий путь к go ...

Еще одна идея, которая может работать или не работать, - это попытка некоего аспектно-ориентированного посткомпилятора (такого как PostSharp) добавить аспекты журналирования в код, который вы пытаетесь проанализировать.

Удачи!

...