Возврат или наследование универсального объекта, содержащего вложенный класс
Я замечаю очень странное поведение при использовании макета класса, который выглядит следующим образом:
// Contents of assembly A:
public class MyParentClass
{
public class NestedClass
{
}
}
// Contents of assembly B:
public class AnotherClass : List<MyParentClass.NestedClass>
{
}
Я могу добавить сборку A как зависимость сборки B. Этот пример будет компилироваться без каких-либо сообщений об ошибках, но когда речь идет, например, о загрузке сборки B в качестве ссылки для модульного тестирования, я получу эту ошибку, когда придет время скомпилировать юнит-тесты:
Не удалось загрузить файл или сборку "AssemblyB, Version=1.0.0.0, Culture= нейтральный, PublicKeyToken=null" или одну из ее зависимостей. Система не может найти указанный файл.
Сборка, которую генерирует этот код, действительно работает, и я могу запустить созданную DLL с помощью Redgate Reflector и увидеть мой код, как и ожидалось, но модульные тесты отказываются загружать его.
Я почти уверен, что эта проблема связана с тем фактом, что я вызываю вложенный класс, который находится в другой сборке, и я, вероятно, в конечном итоге все равно буду рефакторинг этого проекта, но мне бы очень хотелось знать, почему это не работает как ожидается. Если бы возникла проблема с использованием классов таким образом, я бы ожидал, что компилятор сгенерирует исключение.
Спасибо за ваше время.
3 ответа
Я сомневаюсь, что это как-то связано с вложенными классами - просто отсутствие транзитивных зависимостей, которые обнаруживаются в.NET.
В основном, если вы собираетесь использовать AnotherClass
в одном проекте вам нужно явно добавить ссылку на оба AssemblyB
а также AssemblyA
, Таким образом, оба должны быть скопированы и загружены соответствующим образом.
Если это не поможет, попробуйте включить ведение журнала Fusion.
Вы получаете это сообщение об ошибке в Visual Studio 2010, если ваш проект имеет целевую платформу, установленную на "Профиль клиента Framework 4", и связанный DLL имеет целевую платформу "Framework 4".
Проверьте это в настройках вашего проекта.
"Копировать локальный" включен для этой ссылки? Я предполагаю, что ваш тестовый проект, тестирующий сборку B, не имеет копии сборки A. Если для ссылок "Копировать локально" установлено значение true, копии должны быть скопированы, чтобы их можно было правильно найти при компиляции (и, наконец, выполнении) тестов.,