2010-03-29 2 views
0

У меня возникла проблема с настройкой следующего в Visual Studio 2008: родительского проекта, который включает класс метода entry()() и объявляет интерфейс, и дочерний проект, который имеет классы, реализующие интерфейс, объявленный в родительском проекте.Организация проекта Visual Studio 2008 для исполнимости и сборки

Я указал, что тип вывода родителя является консольным приложением, а тип вывода Child - это библиотека классов. В Child я добавляю ссылку на родителя в качестве проекта и указываю, что Child зависит от родителя и что порядок сборки должен быть родительским, а затем дочерним.

Сборка успешно завершена, и, насколько я могу судить, правильные вещи отображаются в каталоге Child/bin/debug: Parent.exe и Child.dll.

Однако, если я бегу Parent.exe, то в тот момент, когда он должен загрузить класс из Child.dll, он терпит неудачу с сообщением об ошибке:

исключение выполнения операции System.TypeLoadException: Не удалось загрузить введите «Child.some.class» из сборки «Parent, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null».

Я думаю, я смущен относительно того, как играть вместе с родителями и детьми проекты. Я планирую иметь больше дочерних проектов, которые используют ту же структуру, которая настроена в родителе, и поэтому я не хочу переместить класс точки входа в проект Child. Если я попытаюсь указать, что проект Child также является консольным приложением, то процесс сборки завершится неудачно, потому что в дочернем элементе нет основного() элемента entry(), хотя родительский проект включен в качестве ссылки.

Любая помощь была бы рада! Спасибо, Martin

ответ

0

Вы хотите избежать круговых зависимостей.

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

2

Как правило, вы хотите изменить свою иерархию: ваш проект .exe должен зависеть от ваших проектов сборки сборок (что вы называете «Ребенок»). Затем, чтобы использовать типы в вашей спутниковой сборке, вы хотите добавить ссылку из своего проекта .exe в свой проект сборки. Сделайте это, щелкнув правой кнопкой мыши проект .exe в обозревателе решений VS, затем добавьте ссылку ... нажмите вкладку «Проекты» и выберите проект сборки.

Редактировать: Если вы хотите настроить «фреймворк» для общего проекта (либо путем определения interfaces, либо базовых классов), то я бы начал делать это в одной основной сборке; Поместите эти определения в нечто вроде MyProject.Core.dll. Тогда ваши «реализующие» проекты/сборки будут иметь ссылку на ваш проект MyProject.Core. Учитывая все это, вы, возможно, ищете нечто вроде структуры IOC/DI. См. Ninject, StructureMap, Castle Windsor и т. Д.

0

Так что в прекрасной традиции ответа на собственные вопросы я решил, что для того, чтобы успешно позвонить GetType(), я должен указать правильную сборку. Каждый проект скомпилирован в собственную сборку (Application.exe, Interface.dll и Implementation.dll). Поэтому для того, чтобы создать экземпляр класса реализации в Application Main() классе, я должен назвать:

Type actionType = Type.GetType("ImplementationClass", "Implementation", true); 

Это кажется немного сентиментальным, но, по крайней мере, это работает.

Смежные вопросы