Не удается загрузить управляемую сборку, расположенную в одной папке

Чтобы воссоздать свою производственную среду, я создал следующую структуру папок:

c: \ TEST \ test.dll c:\TEST\test \ tools.dll

Test.dll скомпилирован с использованием следующего файла App.config:

  <?xml version="1.0" encoding="utf-8" ?>
  <configuration>
    <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <probing privatePath="tested"/>
      </assemblyBinding>
    </runtime>
  </configuration>

Насколько я знаю, приложение должно искать его файл инструментов в подпапке. Когда я пытаюсь запустить станцию, я все еще получаю ошибку, что файл не был найден.

Чтобы дать некоторый контекст, вот пример исходного кода tests.dll:

    namespace ConsoleApplication1
    {
        public static class Testable
        {
            public static tools.IToolAble usefultool = null;

            public static void initialisation()
            {
                if (usefultool == null) usefultool = new UsefulTest()
            }
        }

        public class UsefulTest : tools.IToolAble
        {
        }
    }

и пример tools.dll источник:

    namespace tools
    {
        public interface IToolAble
        {
        }
    }

Код, который вылетает, - это мой тестовый код, который работает следующим образом:

    private CustomMock controller = new CustomMock();
    public void TestFixtureSetUp()
    {
        controller.LoadFrom(@"c:\TEST\tested.dll");

        //The next line crashes because tools assembly is needet but not found
        controller.InvokeInitialisation();
    }

Что мне не хватает? App.config правильный?


РЕДАКТИРОВАТЬ:

Ответ ниже является правильным, путь известен только после того, как можно выбрать правильный DLL. Так что другая команда должна добавить new ResolveEventHandler перед загрузкой. Вот упрощенная версия этого:

    internal void AddResolveEventHandler(string assemblyname, string assemblylocation)
    {
        AppDomain.CurrentDomain.AssemblyResolve +=
        new ResolveEventHandler(
            (sender, args) =>
            {
                Assembly ret = null;
                if (
                    new AssemblyName(args.Name).Name == assemblyname && 
                    File.Exists(assemblylocation))
                {
                    ret = Assembly.LoadFrom(assemblylocation);
                }
                return ret;
            }
        );
    }

1 ответ

Решение

test.dll скомпилирован с использованием следующего файла App.config

Это должен быть файл yourapp.exe.config, а не файл.config для DLL. CLR всегда ищет только файл.config, связанный с основным процессом.

И обратите внимание на app.vshost.exe.config, необходимый при отладке с включенным процессом хостинга.

И будьте осторожны при использовании бегунов модульного теста, другой файл.exe

Подумайте, действительно ли это стоит того. Вашему пользователю будет все равно, где находится DLL.

Другие вопросы по тегам