Возврат или наследование универсального объекта, который содержит вложенный класс - PullRequest
2 голосов
/ 23 ноября 2010

Я замечаю очень странное поведение при использовании макета класса, который выглядит следующим образом:

// Contents of assembly A:
public class MyParentClass
{
    public class NestedClass
    {
    }
}

// Contents of assembly B:
public class AnotherClass : List<MyParentClass.NestedClass>
{
}

Я могу добавить сборку A как зависимость сборки B. Этот пример будет компилироваться без каких-либо сообщений об ошибках, но когда речь идет, например, о загрузке сборки B в качестве ссылки для модульного тестирования, я получу эту ошибку, когда она приходит время для компиляции юнит-тестов:

Не удалось загрузить файл или сборку 'AssemblyB, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = null 'или одна из его зависимостей. Система не может найти указанный файл.

Сборка, которую генерирует этот код, действительно работает, и я могу запустить созданную DLL с помощью Redgate Reflector и увидеть мой код, как и ожидалось, но модульные тесты отказываются загружать его.

Я почти уверен, что эта проблема связана с тем фактом, что я вызываю вложенный класс, который находится в другой сборке, и я, вероятно, в конечном итоге все равно буду рефакторинг этого дизайна, но мне бы очень хотелось знать, почему это так не работает, как ожидалось. Если бы возникла проблема с использованием классов таким способом, я бы ожидал, что компилятор сгенерирует исключение.

Спасибо за ваше время.

Ответы [ 3 ]

0 голосов
/ 23 ноября 2010

Я сомневаюсь, что это как-то связано с вложенными классами - просто отсутствие транзитивных зависимостей, появляющихся в .NET.

По сути, если вы собираетесь использовать AnotherClass в одном проекте,Вам нужно будет явно добавить ссылку как на AssemblyB , так и на AssemblyA.Таким образом, оба должны быть скопированы и загружены соответствующим образом.

Если это не поможет, вы можете попробовать , включающий ведение журнала Fusion .

0 голосов
/ 23 ноября 2010

Вы получаете это сообщение об ошибке в Visual Studio 2010, если ваш проект имеет целевую платформу, установленную на «Профиль клиента Framework 4», и связанная DLL имеет целевую платформу «Framework 4».

Проверьте это в настройках вашего проекта.

0 голосов
/ 23 ноября 2010

Включена ли для этой ссылки функция «Копировать локально»? Я предполагаю, что ваш тестовый проект, тестирующий сборку B, не имеет копии сборки A. Если для ссылок "Копировать локально" установлено значение true, копии должны быть скопированы, чтобы их можно было правильно найти при компиляции (и, наконец, выполнении) тестов. .

...