zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Spring-Cloud 学习笔记-(4)负载均衡器Ribbon
    Spring-Cloud 学习笔记-(5)熔断器Hystrix
    微信支付(APP)
    Resetting Frame Animation
    Java内部类与final关键字详解
    UML中关联(Association)和依赖(Dependency)的区别
    ListView 介绍
    android Activity类中的finish()、onDestory()和System.exit(0) 三者的区别
    AsyncTask和Handler对比
    create groups 和 create folder reference
  • 原文地址:https://www.cnblogs.com/congqiandehoulai/p/14346218.html
Copyright © 2011-2022 走看看