Почему я получаю "System.IO.FileNotFoundException: не удалось загрузить файл или сборку" при установке ссылки на "copylocal=false"?

Вот ситуация: я пытаюсь запустить модульные тесты, используя тестовый проект, который я назову "TestProject". Это тестирование класса в другом проекте, который я назову "Class1" и "Project1".

Project1 выполняет динамическую отложенную загрузку различных DLL во время выполнения, которую я назову "TheDynamicDLLs". Project1 находит эти DLL, просматривая каталог относительно своего собственного пути вывода сборки.

Первая часть проблемы возникает, когда TestProject ссылается на Project1. Очевидно, что он копирует недавно созданный Project1.dll в свой собственный каталог сборки, а затем, когда Project1.dll ищет TheDynamicDLLs по пути относительно его местоположения, он не может найти их, потому что он работает из местоположения TestProject, а не из его своя.

Чтобы это исправить, я перешел к ссылкам TestProject, щелкнул правой кнопкой мыши ссылку Project1 и открыл его свойства. Затем я устанавливаю "Локальное копирование" на "Ложь". Я также удостоверился, что свойство ссылки "Path" совпадает с путем сборки Project1.

Теперь у меня новая проблема, и я даже не могу понять, что это такое. Всякий раз, когда я запускаю модульный тест, он завершается с сообщением "System.IO.FileNotFoundException: не удается загрузить файл или сборку [информация, именующая Project1 как недоступную сборку]".

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

Вот полный протокол испытаний с именами и такими местами в целях конфиденциальности:

Test Name:  Class1_Tests
Test FullName:  TestProject.TestClass.Class1_Tests
Test Source:    c:\Code\Solution1\Tests\TestProject\TestClass.cs : line 175
Test Outcome:   Failed
Test Duration:  0:00:00.0348455

Result Message: 
Test method TestProject.TestClass.Class1_Tests threw exception: 
System.IO.FileNotFoundException: Could not load file or assembly 'Project1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.=== Pre-bind state information ===
LOG: DisplayName = Project1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
 (Fully-specified)
LOG: Appbase = file:///C:/Code/Solution1/Tests/TestProject/bin/Debug
LOG: Initial PrivatePath = NULL
Calling assembly : TestProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Code\Solution1\Tests\TestProject\bin\Debug\TestProject.dll.config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file:///C:/Code/Solution1/Tests/TestProject/bin/Debug/Project1.DLL.
LOG: Attempting download of new URL file:///C:/Code/Solution1/Tests/TestProject/bin/Debug/Project1/Project1.DLL.
LOG: Attempting download of new URL file:///C:/Code/Solution1/Tests/TestProject/bin/Debug/Project1.EXE.
LOG: Attempting download of new URL file:///C:/Code/Solution1/Tests/TestProject/bin/Debug/Project1/Project1.EXE.
Result StackTrace:  at TestProject.TestClass.Class1_Tests()

Из журналов похоже, что TestProject все еще пытается загрузить dll Project1 из своего собственного пути сборки #$%^ing, несмотря на то, что я ТОЧНО сказал ему НЕ копировать local. (Grrrr...)

Что я делаю неправильно?

1 ответ

!!! ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ: исходный вопрос, который я разместил, был о проблеме с моим решением более глубокой проблемы. Этот ответ является решением этой более глубокой проблемы, а не той, о которой спрашивает вопрос.

Для дальнейшего объяснения: Первоначальный вопрос заключался в том, как заставить среду выполнения правильно загружать ссылочные зависимости, когда эти ссылки были установлены на "CopyLocal=false".

Этот вопрос был задан, потому что я установил copylocal=false, чтобы сохранить dll зависимостей в исходном пути сборки, даже когда он был загружен и запущен как часть другого проекта модульного тестирования, чтобы он мог находить элементы в время выполнения, которые были расположены в путях к папке относительно ее пути сборки.

Этот ответ является ответом на первую проблему, устраняя необходимость устанавливать copylocal=false в первую очередь. Следовательно, я НЕ буду выбирать свой ответ здесь как наиболее полезный. Если у кого-то есть ответ на прямой вопрос, он все равно должен опубликовать его, чтобы помочь людям, которые могут бороться с этой проблемой по другим причинам, чем моя.

Тем не менее, вот мое решение причин, по которым мне нужно было установить copylocal=false:

  1. Добавлены TheDynamicDLLs в Project1, но НЕ как ссылки. Просто щелкните правой кнопкой мыши Project1 в обозревателе решений и выберите "Добавить существующий элемент", затем перейдите к каждому местоположению DLL и добавьте его в качестве ссылки. (Важно добавить в качестве ссылки, чтобы она обновлялась всякий раз, когда ее перестраивает ее DynamicDLLProject).
  2. Щелкните правой кнопкой мыши вновь добавленный элемент в Project1 и выберите "Свойства". Установите "Build Action" на "None" и установите "Copy to Output Directory" на "Copy if newer" или "Copy Always".
  3. Повторите шаги 1 и 2 для каждой динамической библиотеки DLL, которую Project1 будет / может загружать во время выполнения.
  4. Конечно, в TestProject я снова установил для ссылки Project1 значение "Копировать локально = True".

Эффект этого состоит в том, что, хотя динамические dll на самом деле не ссылаются и не компилируются в Project1 (как и должно быть, чтобы не дать им загружаться при запуске Project1), любые проекты, которые ссылаются на Project1 и копируют его dll в свой выходной путь, также скопирует элементы, которые добавляются как часть выходных данных этого проекта (в данном случае TheDynamicDLLs).

Я надеюсь, что это поможет любому, кто имеет эту проблему по той же причине, что и я.

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