Copiando dependencies de uma DLL no Visual Studio

Como posso configurar um projeto no Visual Studio para copiar as DLLs de terceiros que uma das referências do projeto depende?

Eu tenho um projeto de aplicativo principal e uma DLL de biblioteca de class. O aplicativo principal referencia a DLL de biblioteca de classs e a própria DLL faz referência a algumas DLLs de terceiros. Quando eu compilar o aplicativo principal, ele copia automaticamente a biblioteca de classs DLL para seu diretório de saída, mas não copia as DLLs de terceiros.

Eu não quero adicionar referências para as DLLs de terceiros do projeto principal do aplicativo porque o aplicativo principal não as usa, elas são usadas somente pela biblioteca de classs.

Você pode conseguir isso com a janela de propriedades do projeto. O Visual Studio permite que você defina events para ocorrer, antes ou depois da construção. Para acessar a janela de propriedades do projeto, basta clicar com o botão direito do mouse em seu projeto na janela do gerenciador de soluções e clicar em ‘propriedades’. Do lado esquerdo, vá para a guia “criar events”.

Na checkbox de pós-construção, digite alguns comandos de cópia. Por exemplo:

copy "$(SolutionDir)mydll.dll" "$(TargetDir)" 

Onde $(SolutionDir) e $(TargetDir) são variables ​​predefinidas. A syntax padrão é a seguinte:

 copy "source directory and file name" "destination directory" 

Se você clicar no botão ‘edit post build …’, será exibida uma checkbox com uma lista dessas variables ​​predefinidas que você pode inserir (como $(SolutionDir) e $(TargetDir) )

Como observação, este é um processo útil para copiar outros arquivos, como arquivos de configuração personalizados, imagens ou quaisquer outras dependencies que seu projeto possa ter.

O fragment a seguir funciona para mim:

  ...   Always   ...  

Isso funciona para c #. Para o C ++ nativo, ele ainda copia a dll para a pasta de saída, mas essa dependência não é visível no Visual Studio; ela deve ser editada diretamente no arquivo do projeto.

Para testar em um exemplo não-trivial, tentei executar o projeto C # A, que depende do projeto C ++ nativo B. Projetos B dependem de dll nativo de terceiros C – essa dependência é implementada por meio do fragment acima no arquivo de projeto. Quando eu construo A, C é copiado para a pasta binária.

Eu tentei no Visual Studio 2010.

Dê uma olhada nessa solução fornecida por Alex Yakunin http://blog.alexyakunin.com/2009/09/making-msbuild-visual-studio-to.html Ela funcionou muito bem para mim – o cenário em que as bibliotecas DevExpress foram usadas expressamente outras dependencies que causaram problemas quando implantadas)

  • Nota 1: O Visual Studio 2010 parece adicionar dlls referenciadas automaticamente, mas o msbuild não. Então a solução de Alex funcionou desde que os scripts de lançamento usaram msbuild.
  • Observação 2: também precisava garantir que, para as bibliotecas referenciadas (aquelas referenciadas no código), o copy-local estava realmente definido como True no csproj, mesmo que o Solution Explorer dissesse que era. A melhor maneira é definir copy-local = False, Save, definir copy-local = True, Save.

Essas duas etapas – copy-local = true para bibliotecas referenciadas e adição de alvos msbuild para as referências indiretas automatizaram a configuração da compilation para mim.

Eu não recomendaria fazer isso. Você acaba com uma explosão N ^ 2 no número de montagens sendo copiadas (e potencialmente, sendo reconstruídas). Se possível, você deve ter todos os seus projetos colocar seus conjuntos no mesmo $ (OutDir). Se você está usando o TFS, o Team Build faz isso por você.

Vá para o aplicativo principal, referências, à sua referência de biblioteca de classs.

Defina “Copiar local” como Verdadeiro.

Ele agora copiará o diretório bin da sua biblioteca de classs para o diretório bin da aplicação principal. Incluindo quaisquer dlls de terceiros de sub-dependência.

Não gosto de ter meus arquivos de dependência localizados na pasta raiz do projeto, mas em uma subpasta. Mas os arquivos devem ser colocados na pasta raiz na pasta de compilation.

Meus events de construção são assim:

insira a descrição da imagem aqui

insira a descrição da imagem aqui

insira a descrição da imagem aqui

  Command: call xcopy /S /Y "$(SolutionDir)Dependencies\*.*" "$(TargetDir)" 

No caso “Dependências” também contém subpastas, como o meu.

100% de certeza que isso funcionará. Basta replace dll com o seu ref pessoal. Arquivo

  ..\..\..\3rdParty\Extended WPF Toolkit-2.2.1\Xceed.Wpf.Toolkit.dll Always False   Xceed.Wpf.Toolkit.dll Always False  

Eu não estou realmente ciente de nenhuma maneira de fazer isso além de adicionar uma referência ao dito .dll no próprio projeto. Nós encontramos isso em alguns dos nossos projetos aqui, e a única solução que encontramos é adicionar a referência. Eu quero dizer que um de nossos desenvolvedores fez alguma pesquisa e achou que esta era a única solução, mas não me cite sobre isso.