Build Action: Content - как получить его в папке «Executing Assemblies», а не просто в папке проекта? - PullRequest
3 голосов
/ 30 апреля 2011

У меня есть Сервис, который ссылается на ProjectA.В ProjectA у меня есть ряд XML-файлов, у всех из которых есть Действие построения из Содержимое и Копирование в направление вывода из Копировать всегда .

Когда я компилирую, как и ожидалось, я могу перейти в папку ProjectA / bin / debug и посмотреть файлы XML.Это хорошо, но когда я запускаю Сервис, который ссылается на ProjectA, эти файлы НЕ включаются в папку Service / bin / debug (хотя там есть ProjectA.dll).

Я ожидал, что файлы XML также будут скопированы в папку Service / bin / debug, поскольку они помечены как Content.Как и сейчас, этот флаг «содержимого» кажется немного бесполезным, поскольку исполняющая сборка, похоже, не получает «доступа» к этим файлам, за исключением включения их в проект «Сервис» (чего я хочу избежать, так как яу вас будет несколько проектов, ссылающихся на ProjectA).

Какие-нибудь советы, как с этим бороться?

Ответы [ 6 ]

1 голос
/ 30 апреля 2011

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

У вас есть большая проблема, службе также необходимо найти сборку.Что, если вы хотите поделиться им между проектами EXE, должно быть в хорошо известном месте, которое не будет найдено автоматически, если вы не скопируете сборку в GAC.Вы не можете копировать .xml файлы в GAC.

Пока ваша цель - поделиться сборкой, у вас есть два подхода:

  • Зарегистрируйтесборка в GAC, так что ее можно найти.Поместите файлы .xml в хорошо известное место, для этого была создана папка c: \ programdata.

  • Оставьте сборку в произвольном месте, например c: \ program files \Projecta.Вам необходимо реализовать событие AppDomain.AssemblyResolve в каждом проекте EXE, чтобы помочь CLR найти сборку.Устанавливать путь к папке в файле .config целесообразно.Эта же папка теперь также является хорошим местом для файлов .xml.Попробуйте добавить в библиотеку публичное статическое свойство, которое возвращает путь к папке.Вы можете использовать Assembly.GetExecutingAssembly (). Расположение для этого.Остерегайтесь значительной опасности DLL Hell, когда вы выбираете этот подход, обновление DLL для одного решения потенциально может сломать все остальные, использующие projecta.

1 голос
/ 30 апреля 2011

Другой возможный вариант - добавить XML-файлы из ProjectA в качестве ссылки в сервисном проекте, а затем установить связанные файлы для содержимого и всегда копировать. Чтобы добавить файл в качестве ссылки, выберите параметр «Добавить существующий», а затем выберите файл для добавления, но вместо простого нажатия кнопки «Добавить» используйте раскрывающийся список и выберите «Добавить как ссылку». Я редко пользуюсь этим вариантом, но в этом случае он может быть полезен ...

enter image description here

1 голос
/ 30 апреля 2011

если вы создаете событие Pre-Build в проекте Service, содержащем необходимые копии командной строки, у вас все будет в порядке.

0 голосов
/ 27 февраля 2013

не могу вспомнить, где я нашел это, но попробуйте следующее.при развертывании обратите внимание на ошибку «публикации» в VS 2010, поскольку она не копирует содержимое проекта зависимости в выходной каталог публикации.В настоящее время вы должны копировать вручную, но я думаю, что это было исправлено в VS2012.

    /// <summary>
    /// Gets the current application directory.
    /// For class libraries and executables returns the executing directoy.
    /// For web applications returns the bin directory. This is important to find content relative to the assembly in the bin folder
    /// versus the actual executing location which maybe the shallow copy folder (Microsoft Asp.Net temporary folder).
    /// </summary>
    /// <returns>path to the appication directory</returns>
    public static string GetApplicationDirectory()
    {
        if (AppDomain.CurrentDomain.RelativeSearchPath != String.Empty && AppDomain.CurrentDomain.RelativeSearchPath != null)
            return AppDomain.CurrentDomain.RelativeSearchPath;
        else
            //if null check normal way     
            return System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
    }
0 голосов
/ 07 февраля 2013

попробуйте это в вашем web.config.

<hostingEnvironment shadowCopyBinAssemblies="false" />

заставляет dll быть прочитанным прямо из папки bin (где находится ваш контент).

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

0 голосов
/ 30 апреля 2011

Для таких ситуаций я бы либо:

  • Используйте общую папку (например, Common Program Files или другую) и сохраняйте ее местоположение в общих настройках приложения в рамках решения.
  • Используйте действие после сборки, чтобы скопировать файлы в заданный вручную каталог вывода.

Вы также можете встраивать файлы в сборку и получать их как ресурсы ...

Привет

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