c# 反射时候,静态类被调用两次问题总结 c# Reflection static constructor call twice

C#中,有时候想把一些【类库】放到另一个文件夹里,

而【类库】又引用其他【静态类库】,

主程序也引用【静态类库】,这时候经常使用Assembly.LoadFrom()方法来加载【类库】,但是有时候会发现【静态类库】被实例化了多次

文件夹结构如下图

 

 

 测试代码:

Main.exe里的代码

Main.cs:

 static void Main(string[] args)
        {

            MyStaticClass.AMyStaticClass.Initialize();
            //加载plugin  
            var files = Directory.GetFiles(@"pluginsss");
            foreach (var file in files)
            {
                if (file.EndsWith(".dll"))
                {
                    var a = Assembly.LoadFrom(file);
                    var types = a.GetTypes();
                    foreach (var type in types)
                    {
                        if (type.IsClass && type.Name == "MyPlugin")
                        {
                            a.CreateInstance(type.FullName);
                        }
                    }
                }
            }

            Console.WriteLine("Main赋值后:" + MyStaticClass.AMyStaticClass.GetField());
            Console.Read();
        }

 

类库,myPlugin代码:

public class MyPlugin
    {
        public MyPlugin()
        {
            Console.WriteLine("plugin初始化:获取static字段:" + MyStaticClass.AMyStaticClass.GetField());
        }

    }

 

静态类代码 staticclass.cs

 public class AMyStaticClass
    {
        public static string StaticField;

        public static string GetField()
        {
            return StaticField;
        }

        public static void Initialize()
        {
            StaticField = "Initialized";
        }

        static AMyStaticClass()
        {
            Console.WriteLine(DateTime.Now.ToString()+ " 初始化了MyStatic"+"  domain="+Thread.GetDomain().FriendlyName);
            Thread.Sleep(100);
        }
    }

 

测试后发现:

 

 被调用了两次初始化。

原因就是Assembly.loadFrom里加载了静态类dll,且dll文件夹跟主程序文件夹不一致。

解决办法就是:将pluginsss文件夹里的静态类库dll删除。或者将pluginsss文件夹改名改成程序可识别的plugins即可。这样静态了就不会被初始化两次了

测试代码:https://files.cnblogs.com/files/congqiandehoulai/2021-01-29-%E5%8F%8D%E5%B0%84%E5%A4%9A%E6%AC%A1%E5%88%9D%E5%A7%8B%E5%8C%96%E9%9D%99%E6%80%81%E7%B1%BB.rar

参考文档:https://bytes.com/topic/c-sharp/answers/689353-static-constructor-called-twice

 

posted @ 2021-01-29 17:39  灰主流  阅读(489)  评论(0编辑  收藏  举报