C # Ошибка? Загрузка сборки с общим типом - PullRequest
2 голосов
/ 18 июня 2011

У меня есть класс, который динамически загружает сборку так:

    Assembly asm = Assembly.LoadFile(args[1]);        
    runner.RunTestOnAssembly(asm);

затем другой класс запускает тест для этой сборки:

    foreach (var cspecType in asm.GetTypes())
    {
        RunTestOnType(cspecType);
    }

Загруженная сборка ссылается на другие сборки в той же папке, [Debug \ Tests] , а программа, которая загружает сборку, находится в папке [Debug] .

Загруженная сборка (CalcSpecAsm):

    public class CalcSpec : CSpecFacade<ICalc>
    {
        public CalcSpec()
        : base(new Calc())
        {

        }
    }

Ссылочная сборка (CalcAsm):

    public class Calc : ICalc
    {
    /// <summary>
    /// Initalisation constructor
    /// resets the Total value.
    /// </summary>
    public Calc()
    {
        Total = 0;
    }
    .....

На CSpecFacade есть ссылка в другой сборке.

И теперь проблема в том, что, если я загружаю сборку CalcSpecAsm, я получаю ошибку сборки loaderError в GetTypes (), что она не может разрешить ссылку на сборку CalcAsm.

Проблема в этой строке кода: public class CalcSpec : CSpecFacade<ICalc>

Если я удаляю обобщенный аргумент ICalc и инициализирую его в конструкторе, он работает отлично, но это не то, что мне нужно.

НО: если я копирую программу loaderAssembly в [Debug \ Test] , а затем запускаю ее, все работает нормально.

Как решить проблему и чем она вызвана?

1 Ответ

3 голосов
/ 18 июня 2011

при загрузке сборок из других мест вы можете получить ошибки, говорящие о том, что сборка не может быть загружена или ее зависимости не могут быть загружены.

Это означает, что при загрузке вашей сборки .Net Runtime не смог разрешить все зависимости вашей сборки.

Поэтому вам необходимо предоставить способ решения этой проблемы.

Сначала вам нужно добавить событие разрешения в свой домен приложений, например,

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);

Затем в этом случае вам нужно будет загрузить свои зависимости.

    Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {

        //Build the path of the assembly from where it has to be loaded.                
        assemblyPath = System.IO.Path.Combine("your path", args.Name.Substring(0, args.Name.IndexOf(",")) + ".dll");
        assembly = Assembly.LoadFrom(assemblyPath);

        //Return the loaded assembly.
        return assembly;
    }

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...