0

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

我正在开发一个企业产品,它(非常不幸)继承了一些仍然在系统的几个部分中使用的旧 VB6 代码。我目前正在分析如何最好地确定实际使用了多少 VB6 代码,以便公司可以将战略迁移到 .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 对象的每个方法调用和属性。

谢谢你。

4

1 回答 1

1

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

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

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

祝你好运!

于 2020-02-21T15:11:29.227 回答