Организация проекта Visual Studio 2008 для исполняемого файла и сборки - PullRequest
0 голосов
/ 30 марта 2010

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

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

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

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

исключительная ситуация при выполнении операции System.TypeLoadException: не удалось загрузить тип 'Child.some.class' из сборки 'Родитель, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = null'.

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

Любая помощь будет приветствоваться! Спасибо, Мартин

Ответы [ 3 ]

2 голосов
/ 30 марта 2010

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

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

0 голосов
/ 31 марта 2010

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

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

Кажется, немного обманут, но, по крайней мере, работает.

0 голосов
/ 30 марта 2010

Вы хотите избежать циклических зависимостей.

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

...