none
Построение приложения и копирование dll. RRS feed

  • Вопрос

  • В исходниках есть папка DLL, в ней лежат нужные управляемые DLL, ссылки на которые я добавил через references. У меня получается так, что для того, чтобы DLL оказались в папке приложения при построении, в свойствах DLL в Ссылках студии, приходится ставить "Копировать локально - да". При этом, всегда копирует в корневую папку построенного приложения. А мне надо, чтобы в папке построенного приложения создало папку с таким же именем, как и папка с DLL в исходниках, и поместило все DLL в нее, И нормально с ними работало. Если поставить "Копировать локально - нет", то вообще не копирует DLL.

    Также возможет вариант, что управляемые DLL копируются, но при попытке запуска приложения пишет, что они отсутствуют. То есть, приложения использует DLL только своей папки приложения.

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





    19 августа 2011 г. 21:24

Ответы

  • в свойствах проекта есть: Build Events - Post-build event command line
    например, чтобы копировать my.dll в \bin\

    copy "c:\temp\my.dll" "$(TargetDir)"

    вместо copy можете вызвать свою программу.

    другой вариант: реализовать Task для MSBuild
    http://msdn.microsoft.com/ru-ru/library/microsoft.build.utilities.task.aspx


    • Предложено в качестве ответа Malobukv 20 августа 2011 г. 8:32
    • Помечено в качестве ответа Qwester33 20 августа 2011 г. 13:13
    20 августа 2011 г. 7:55
  • Есть альтенатива AssemblyResolve, не требующая изменений в коде - можно указать дополнительные папки для поиска сборок прямо в файле конфигурации приложения: Элемент <probing>.

    Вариант с AssemblyResolve/Assembly.LoadFrom грузит сборки не в основной контекст, и последствия этого могут быть не слишком очевидными.


    My blog | My Favorite Project
    • Помечено в качестве ответа Qwester33 3 сентября 2011 г. 13:07
    25 августа 2011 г. 13:57
    Модератор

Все ответы

  • в свойствах проекта есть: Build Events - Post-build event command line
    например, чтобы копировать my.dll в \bin\

    copy "c:\temp\my.dll" "$(TargetDir)"

    вместо copy можете вызвать свою программу.

    другой вариант: реализовать Task для MSBuild
    http://msdn.microsoft.com/ru-ru/library/microsoft.build.utilities.task.aspx


    • Предложено в качестве ответа Malobukv 20 августа 2011 г. 8:32
    • Помечено в качестве ответа Qwester33 20 августа 2011 г. 13:13
    20 августа 2011 г. 7:55
  • То есть, если я хочу после построения поместить управляемую  ДЛЛ в определенную под-директорию, мне обязательно прописывать ее копирование в Build Events - Post-build event command line? А по дефолту при построении студия их может положить только в директорию построенного приложения?

    20 августа 2011 г. 13:30
  • > по дефолту при построении студия их может положить только в директорию построенного приложения?

    у каждого проекта есть файл с расширением .csproj, в нем тег: OutputPath, значение "bin\Debug\" - его можно изменить.

    > мне обязательно прописывать ее копирование в Build Events - Post-build event command line?

    не обязательно, есть другой вариант: в .csproj добавить тег:

    <Target Name="AfterBuild"> 
       вписать необходимые task; подробнее см. Executing a Task from a Project File  
    </Target>

     

    20 августа 2011 г. 14:15
  • Мне надо попроще вариант, я буду использваоть копирование через Build Events - Post-build event command line

    Хорошо, копировать то я могу куда захочу. А как построенное приложение узнает, что нужно ДЛЛ грузить их этого места, куда я скопировал? У меня скомпилированное приложение при запуске не находит ДЛЛ в том месте, куда я скопировал при построении.

    и 2. Почему некоторые ДЛЛ копируются сами, и причем копируются куда нужно, с соблюдением структуры директорий, а некоторые не копируются сами? В свойствах длл поставлено - Не копировать

     



    21 августа 2011 г. 19:18
  • > А как построенное приложение узнает, что нужно ДЛЛ грузить их этого места, куда я скопировал?

    из post-build event записать путь к dll в .config-файл, который приложение прочтет при запуске.
    или записать путь к dll в реестр.

    > приложение при запуске не находит ДЛЛ в том месте, куда я скопировал при построении

    см. AssemblyResolve, How to load an assembly at runtime that is located in a folder that is not the bin folder of the application

    22 августа 2011 г. 4:36
  • Есть альтенатива AssemblyResolve, не требующая изменений в коде - можно указать дополнительные папки для поиска сборок прямо в файле конфигурации приложения: Элемент <probing>.

    Вариант с AssemblyResolve/Assembly.LoadFrom грузит сборки не в основной контекст, и последствия этого могут быть не слишком очевидными.


    My blog | My Favorite Project
    • Помечено в качестве ответа Qwester33 3 сентября 2011 г. 13:07
    25 августа 2011 г. 13:57
    Модератор