• 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

  • 相关阅读:
    redis集群redis-cloud搭建
    Linux下搭建redis服务器
    mybatis主键返回
    分布式文件系统FastDFS
    mapper映射文件不发布
    dubbo发布和引用服务
    PageHelper分页插件
    F. Cards and Joy
    E. Paint the Tree 树形dp
    D. Sequence Sorting dp
  • 原文地址:https://www.cnblogs.com/congqiandehoulai/p/14346218.html
Copyright © 2020-2023  润新知