Круговая зависимость и динамическая загрузка сборки - PullRequest
4 голосов
/ 20 декабря 2011

Это в сборке А

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;
        }
    }
}

Это в сборкеB

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.

Почему я не могу сослаться на AssemblyA из AssemblyB, хотя я могу загрузить AssemblyA через отражение и до сих пор называют его методами?

Очевидно, что практически нет причин для этого, мне просто любопытно, как работает компилятор / CLR, чтобы позволить этому работать через отражение.

1 Ответ

5 голосов
/ 20 декабря 2011

Поскольку компиляция сборки требует ссылки на ее зависимости.Если зависимости для A еще не скомпилированы (потому что они ссылаются на A), вы столкнетесь с проблемой курицы и яйца.

...