Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检测是否在.net中执行了静态构造函数?_C#_.net_Static Constructor - Fatal编程技术网

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

C# 如何检测是否在.net中执行了静态构造函数?,c#,.net,static-constructor,C#,.net,Static Constructor,我正在英特尔Inspector(本机内存泄漏)下测试复杂的.net/COM应用程序。在.net代码的很多地方,我们都在静态字段中缓存对COM对象的引用。很明显,检查员将这些标记为泄漏。在少数情况下,添加抑制就足够了,但是有时标记(作为主COM对象的一部分创建)的对象数量会失控(数百个),抑制这些对象可能会隐藏实际泄漏的类似模式。 长话短说-就在流程退出之前,我正在迭代appdomain中加载的所有程序集中的所有类,并将引用COM对象的静态字段设置为null。如果我可以打印引用COM对象的所有静态

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

然而,若从未使用过类型,那个么当我调用getField(查看它是否为null)时,它的静态构造函数将执行,并且可能会创建更多COM对象。
有没有办法检测当前AppDomain中是否使用过type?

我认为您不能自动执行此操作,但您可以让静态构造函数自己注册。因此,不是迭代程序集中的所有类,而是迭代所有注册的类

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));
    }
}
公共静态类注册器
{
已注册的私有静态列表=新列表();
公共静态无效寄存器(类型)
{
注册。添加(类型);
}
公共静态IEnumerable已注册
{get{return registered;}}
}
公共类MyClass
{
静态MyClass()
{
类别登记册(类别(MyClass));
}
}

不幸的是,我不适合这样做。我不能仅仅为了这个测试而更改生产代码。其次,静态构造函数实际上是由编译器在F#代码中创建绑定时生成的。因此,进行注册需要更改很多类,并且需要更改每个类型(有人添加了带有绑定的新模块/类)。如果您提供一些示例代码(即使在F#中),我确信它将揭示一个架构缺陷或解决它的方法。Philip,我认为我的第一点说明了一切-这只是测试,它不能证明为了注册类实例化而更改1000多个项目是合理的。如果到了最糟糕的地步,我只需要根据手动调试调查手工编写代码(当Inspector标记泄漏跟踪哪个类引用它时)。我想知道调试api是否能够提供我需要的信息。我完全理解这是过分的