.NET拦截COM方法调用

.NET拦截COM方法调用,.net,com,method-interception,.net,Com,Method Interception,在写这篇文章之前,我就这个话题问了10多个问题,以确保我没有遗漏smth,但我找不到这个特定场景的答案 我正在开发一个企业产品,它(非常不幸)继承了一些旧的VB6代码,这些代码仍然在系统的几个部分中使用。我目前正在分析如何最好地识别VB6代码的实际使用量,以便公司能够将战略迁移目标转移到.NET。 我想到了以下想法: 在使用VB6代码的地方,调用它的典型代码(VB.NET)如下所示: Dim myComObject = Server.CreateObject("MyCOMObject") Wit

在写这篇文章之前,我就这个话题问了10多个问题,以确保我没有遗漏smth,但我找不到这个特定场景的答案

我正在开发一个企业产品,它(非常不幸)继承了一些旧的VB6代码,这些代码仍然在系统的几个部分中使用。我目前正在分析如何最好地识别VB6代码的实际使用量,以便公司能够将战略迁移目标转移到.NET。 我想到了以下想法:

在使用VB6代码的地方,调用它的典型代码(VB.NET)如下所示:

Dim myComObject = Server.CreateObject("MyCOMObject")
With myComObject
    .MyCOMProperty = ""
    .MyCOMMethod()
End with
我的想法是在.NET中构建一个facade,在它后面隐藏所有调用COM的代码,并在当前调用COM代码的所有位置调用facade抽象。 换言之:

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

CreateCOMObject的实现会在内部调用Server.CreateObject(comObject),但它也会将此调用记录到数据库中。通过这种方式,我可以分析对所有COM对象的所有调用,了解使用了什么和没有使用什么。然而,这还不够。我还需要了解从COM对象调用哪些方法和属性。出于这个原因,我需要了解是否有一种方法可以拦截COM对象的每个方法调用和属性


谢谢。

正如Simon Mourier所写,不,COM方法没有内置拦截机制,它们(以及属性)只是跳转到虚拟方法表中管理的地址

一些尝试可能是编写代码,通过反射检查COM类并生成一些.NET包装类,或者在内存中(Reflection.Emit),或者通过生成C#代码。而不是使用那个类而不是原来的类。但这是一个漫长的路要走

另一个可能有效,也可能无效的想法是尝试一些面向方面的后期编译器(如PostSharp)将日志方面添加到您尝试分析的代码中


祝你好运

简短的回答是否定的。您可以使用迂回/钩子库,例如:,但这非常困难。
Dim myComObject = comFacade.CreateCOMObject("MyCOMObject")
With myComObject
    .MyCOMProperty = ""
    .MyCOMMethod()
End with