Pergunta

topei com uma situação estranha com MSBuild agora. Há uma solução que tem três projetos: LibX, liby e Exe. Exe referente ao LibX. LibX em suas referências por sua vez liby, tem alguns arquivos de conteúdo, e também referências a uma biblioteca de terceiros (vários conjuntos pré-construídos instalados em ambos GAC e pasta lib local). A biblioteca de terceiros é marcado como "Copy Local" ( "private") e aparece na saída do projeto LibX, como a saída do liby e arquivos de conteúdo do LibX fazer. Agora, a saída do projeto Exe tem saída LibX projeto, arquivos de conteúdo do projeto LibX, saída do projeto liby (provenientes de LibX), mas não assembleias da biblioteca de terceiros.

Agora eu trabalhei isso em torno, fazendo referência a biblioteca de terceiros diretamente no projeto Exe, mas eu não sinto que esta é uma solução "certa".

Alguém já teve esse problema antes?

Foi útil?

Solução

Sim, eu tive esse problema também. Embora eu adoraria dizer o contrário, eu acredito que você deve incluir todas as dependências transitivas como referências em seu arquivo de construção.

Outras dicas

Há uma diferença no comportamento ao construir com MSBuild (ou seja, linha de comando, TFS Construir e outras ferramentas) em comparação com a construção com o Visual Studio. As referências secundárias não estão incluídos no enviados variável referências em tarefas de compilação MSBuild.

Há vários pontos de extensão fornecidos pelo MSBuild para alterar como referências estão a ser resolvido. Eu tenho usado com sucesso AfterResolveReference para corrigir esse problema para alguns dos meus projetos - tenho postado mais informações sobre o plano de fundo no meu blog .

A solução é adicionar o código a seguir em você VBPROJ ou arquivos csproj

  <Target Name="AfterResolveReferences">
    <!-- Redefine referencepath to add dependencyies-->
    <ItemGroup>
     <ReferencePath Include="@(ReferenceDependencyPaths)">
     </ReferencePath>
    </ItemGroup> 
  </Target>

A Microsoft afirmou que este é um não vai resolver em Ligação

Você pode realmente ir para o arquivo Microsoft.CSharp.targets ou Microsoft.VisualBasic.targets (localizado no diretório quadro, geralmente C: \ Windows \ Microsoft.NET \ Framework \ v3.5) e modificar o csc ou VBC parâmetros da tarefa para incluir dependências de referência adicionais. No arquivo (alvos VB, linha 166; alvos C #, linha 164) mudança: \

References="@(ReferencePath)"

para

References="@(ReferencePath);@(ReferenceDependencyPaths)"

Isso pode causar outros problemas, dependendo de como as coisas complicadas são e pode jogar truques com o compilador inproc Visual Studio, mas é a única maneira de fazê-lo em MSBuild que eu encontrei.

A resposta de josant quase funcionou para mim; Eu continuei recebendo um erro no Visual Studio quando eu tentei isso:

Um problema ocorreu ao tentar definir o parâmetro "Referências" para compilador em processo do IDE. Erro HRESULT E_FAIL foi retornado de uma chamada para um componente COM

A solução para o meu problema era colocar uma condição sobre a ItemGroup, como este:

<Target Name="AfterResolveReferences">
  <!-- Redefine referencepath to add dependencies-->
  <ItemGroup Condition=" '$(BuildingInsideVisualStudio)' != 'true' ">
    <ReferencePath Include="@(ReferenceDependencyPaths)"></ReferencePath>
  </ItemGroup>
</Target>

Isso causou Visual Studio para ignorar a mudança de referência completamente, e a construção funciona bem localmente e no servidor de compilação.

Eu tenho combinado Alex Yakunin de solução com um que vai também copiar de dll nativa.

O método AfterResolveReferences falha se você tem um grafo direcionado não uma árvore com um erro "tentando implantar diferentes cópias do dll". (Cf. como configurar msbuild / MSVC para implantar arquivos dependentes das assembleias dependentes )

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top