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