如何检测是否在.net中执行了静态构造函数

本文关键字:net 执行 构造函数 静态 是否 何检测 检测 | 更新日期: 2023-09-27 18:01:51

我正在英特尔检查器下测试复杂的。net/com应用程序(本机内存泄漏)。在。net代码的很多地方,我们在静态字段中缓存对COM对象的引用。很明显督察把这些标记为泄漏。在少数情况下,添加抑制就足够了,但是有时被标记的对象数量(作为主COM对象的一部分创建)失去控制(数百个),并且抑制这些对象可能会隐藏类似的实际泄漏模式。长话短说——就在进程退出之前,我在appdomain中加载的所有程序集中迭代所有类,并且我将引用我的COM对象的静态字段设置为空。如果我可以打印所有引用COM对象的静态字段,即使它们还没有被接受为有效的缓存(并且可能是实际的泄漏),这对将来的使用来说将是非常好的。

然而,如果type从未使用过,它的静态构造函数将在我调用getField(看看它是否为null)时执行,并可能创建更多的COM对象。有什么方法可以检测当前AppDomain中是否使用了type ?

如何检测是否在.net中执行了静态构造函数

我不认为你可以自动做到这一点,但你可以让静态构造函数注册自己。因此,不是遍历程序集中的所有类,而是遍历所有已注册的类。

public static class ClassRegistrar
{
    private static List<Type> registered = new List<Type>();
    public static void Register(Type type)
    {
        registered.Add(type);
    }
    public static IEnumerable<Type> Registered
    { get { return registered; } }
}
public class MyClass
{
    static MyClass()
    {
        ClassRegistrar.Register(typeof(MyClass));
    }
}