2012-09-11 3 views
0

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

Но, кажется, проблема: если я ссылки ProjectA в ProjectB, скомпилированное применение ProjectB не может работать, если нет скомпилированного приложения из ProjectA рядом с ним. Поэтому, если вывод ProjectB является ProjectB.exe, ProjectB.exe выдает сообщение об ошибке при выполнении, если ProjectA.exe не находится рядом с ним. Почему это? Я просто хочу использовать пространства имен от ProjectA в ProjectB, мне не нужно ProjectA, чтобы зависеть от скомпилированной версии ProjectB.

Может кто-нибудь сказать мне, как ссылаться на ProjectA в ProjectB без необходимости вывода ProjectA запустить вывод ProjectB?

ответ

1

Возможно, вам нужна общая dll.

Вы создали классы полезности в проекте A out, поскольку они распределены по всему проекту A (приложение A?), Теперь вы ввели проект B (приложение B), и, поскольку вы заявляете, что ему необходимо получить код от projectA.dll/ех.

Итак, создайте новый проект в своем решении (Ab.Shared.dll возможно :-)) и переместите в него свои классы utiilty. Теперь вы можете ссылаться на эту DLL как из проекта A, так и из проекта B.

Обновление: Просто прочитайте о комментариях о высасывании кода.

Общая dll - наиболее распространенный способ совместного использования кода, но есть и другие способы. Теоретически вы можете просто «включить» те же файлы * .cs в оба проекта и поделиться им таким образом (используйте раскрывающийся список в диалоговом окне «Добавить существующий элемент» и выберите «Добавить как ссылку»). Однако на практике становится все более неудобно поддерживать этот сценарий, поэтому большинство людей используют общую dll.

+0

'ProjectA' - это проект утилиты в целом, поэтому я использую его только для отслеживания общего кода и обновления этого общего кода намного проще. Только 'ProjectB' фактически выводит dll/exe. В основном я хочу, чтобы 'ProjectB' высасывал код из' ProjectA', когда он компилируется, но фактически не зависит от скомпилированной dll/exe 'ProjectA'. – IneedHelp

+0

В этом случае вы, вероятно, путаете проект с пространством имен (что очень часто встречается). Вам не нужно использовать проект, вместо этого просто добавьте папку в ProjectB и перетащите файлы из проекта A – AlSki

+0

Yup, вы правы. Мне просто нужно использовать папку, а не проект. Самое забавное, что я использовал папку в начале, а потом почему-то в прошлом думал, что использование проекта в качестве контейнера - лучшая идея. Спасибо. – IneedHelp

0

В этом случае добавьте скомпилированную dll в папку bin и добавьте ссылку на эту DLL из другого проекта. Не добавляйте ссылку на ваш проект ProjectA.

Когда вы добавляете ссылку на проект с помощью Visual studio, добавьте ссылку -> Проекты, тогда требуется, чтобы проект был скомпилирован и копирует dll/exe в другую папку bin проекта.

+0

Причина, по которой я ссылаюсь на «ProjectA», заключается в том, что 'ProjectB' может сразу увидеть изменения в« ProjectA », и если я обновляю пространства имен в« ProjectA », рефакторинг также обновит их в« ProjectB », а я что это невозможно, если я добавлю скомпилированную dll или 'ProjectA'. Кроме того, тогда я буду зависеть от этой DLL. Разве нет способа, чтобы «ProjectB» высасывал код из «ProjectA» при компиляции «ProjectB»? – IneedHelp

+0

Для вашей первой части вопроса вам нужно будет добавить ссылку на проект, и он также сможет скомпилировать себя. Во второй части вопроса я не уверен, что несколько DLL могут быть объединены в один проект, но я не думаю, что вы можете сделать это из visual studio. –

0

Откройте csproj файл в текстовом редакторе и вставить XML:

<Reference Include="AssemblyName.dll"> 
    <HintPath>$(EnvironmentVariable)\bin\AssemblyName.dll</HintPath> 
    <Private>False</Private> 
</Reference> 
1

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

Если вы ссылаетесь на класс/тип из другой сборки, тогда эта сборка должна присутствовать (или локалироваться) при запуске оригинальной сборки. Если все, что вы делаете, это кодирование, тогда простой project reference in your solution выполнит трюк. Если у вас нет исходного кода Project A, вам понадобится его в его скомпилированной форме - без него CLR не сможет его проверить и узнать, что он содержит.

+0

Спасибо за ваш ответ. По-видимому, я ошибался, думая, что проект станет лучшим контейнером, а не простой папкой, но, как предложил AlSki, достаточно добавить папку, содержащую общие файлы .cs. – IneedHelp

0

Если я правильно понял, у вас есть код в ProjectA.exe, который вы хотите использовать в ProjectB.exe, но во время выполнения вы хотите запустить ProjectB.exe, не требуя, чтобы у пользователя была копия ProjectA .Exe.

Это невозможно. Когда вы используете тип из другой сборки, эта сборка загружается во время выполнения. Тип не копируется из ProjectA в ProjectB.

Мне кажется, что вы должны извлечь общие классы утилиты в ProjectUtility.dll, а затем ссылаться на них как из приложений ProjectA.exe, так и из ProjectB.exe.

EDIT: ILMERGE может быть путем. См. Linking statically in C# для получения дополнительной информации.

+0

'ProjectA' - всего лишь проект, вот и все. Я не собираюсь выводить его на dll или exe, я просто хочу сохранить в нем код и получить доступ к нему из других проектов (которые я собираюсь скомпилировать для exes или dll). То, как я делал это раньше, было связывание файлов .cs от 'ProjectA' до' ProjectB', но это было больно для поддержания, потому что он нуждался в обновлении каждый раз, когда я менял пространство имен или местоположение исходного файла .cs. – IneedHelp

+0

@IneedПомогите проекту * делает * создайте dll или exe, как вы обнаружили. Единственный другой способ, который я хотел бы сделать, чтобы сделать то, что вы хотите, - использовать более ранний подход к связыванию файлов. Обычный подход к отделению общего кода заключается в том, чтобы сохранить его в библиотеке (что в конце концов означает второй «l» в «dll»). – phoog

+0

@IneedПомощь, видимо, вы можете использовать ILMERGE для объединения двух сборок после компиляции. См. Этот ответ SO (хотя он старый и может быть устаревшим): http://stackoverflow.com/a/39147/385844 – phoog

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