循环依赖和动态程序集加载
本文关键字:程序集 加载 动态 依赖 循环 | 更新日期: 2023-09-27 18:18:32
这是在AssemblyA
namespace AssemblyA
{
public class ClassA
{
public static void Main(string[] args)
{
ClassB b = new ClassB();
Console.WriteLine(b.MultiplyTheSumByFactor(2, 3, 4));
Console.ReadKey();
}
public int Multiply(int left, int right)
{
return left * right;
}
}
}
在AssemblyB
namespace AssemblyB
{
public class ClassB
{
public int Sum(int left, int right)
{
return left + right;
}
public int MultiplyTheSumByFactor(int left, int right, int factor)
{
// ClassA a = new ClassA(); // can't reference AssemblyA
int sum = Sum(left, right);
Type type = Assembly.GetCallingAssembly().GetTypes().First();
object a = Activator.CreateInstance(type);
return (int)type.GetMethod("Multiply").Invoke(a, new object[] { sum, factor });
}
}
}
AssemblyA
是一个引用AssemblyB的控制台应用程序。
为什么我不能从AssemblyB
引用AssemblyA
,虽然我可以通过加载AssemblyA
反射和仍然调用它的方法?
显然,实际上没有理由想要这样做,我只是好奇编译器/CLR是如何工作的,以便允许通过反射来工作。
因为编译程序集需要链接到它的依赖项。如果A的依赖项还没有编译(因为它们引用了A),你最终会遇到鸡和蛋的问题。