Como você compartilha código entre projetos / soluções no Visual Studio?


229

Eu tenho duas soluções que têm algum código comum, então eu gostaria de extraí-lo e compartilhá-lo entre eles. Além disso, eu gostaria de poder liberar essa biblioteca independentemente, pois pode ser útil para outras pessoas.

  • Qual é a melhor maneira de fazer isso com o Visual Studio 2008?
  • Um projeto está presente em mais de uma solução?
  • Tenho uma solução separada para o trecho de código separado?
  • Uma solução pode depender de outra?

15
É 2014. Nuget é a resposta.
Ravi

1
@Ravi Eu queria modularizar um aplicativo Web do Visual Studio desenvolvido no meu escritório.No entanto, quando tento modularizar o aplicativo Web do Visual Studio em diferentes aplicativos Web, surge a dependência circular entre os componentes que está errada. Não é possível modularizar o projeto POCO para cada aplicativo da Web planejado, porque há muita dependência. Existe uma maneira de usar o Nuget para ajudar na modularização?
CS Lewis

Respostas:


70

Um projeto pode ser referenciado por várias soluções.

Coloque sua biblioteca ou código principal em um projeto e faça referência a esse projeto nas duas soluções.


150
Ok mas como? Algumas instruções?
cja

2
Essa resposta (antiga) é incompleta por si só devido ao resultado de várias montagens: no entanto, quando acoplada ao ILMerge - especialmente com a opção internalizar - ela se torna uma solução muito poderosa.
user2246674

2
@ user2246674: por que está incompleto devido a várias montagens? O OP não disse nada sobre uma única assembléia.
John Saunders

1
@ Jfly: Renomear coisas que não são publicamente visíveis não afetará o código externo. Mudar o nome de coisas que são visíveis publicamente só deve ser feito em todos os projectos que utilizam o código comum, eo código comum em si, estão em uma única solução. Você pode criar manualmente soluções "principais" que contêm todos esses projetos e que são usadas apenas para esse fim.
John Saunders

1
Depende do que você quer dizer com outra instância. Você provavelmente faria bem em iniciar uma nova pergunta com mais alguns detalhes.
Ilivewithian 01/03/19

248

Você pode "vincular" um arquivo de código entre dois projetos. Clique com o botão direito do mouse no seu projeto, escolha Add-> Existing iteme, em seguida, clique na seta para baixo ao lado do Addbotão:

Captura de tela

Na minha experiência, vincular é mais simples do que criar uma biblioteca. O código vinculado resulta em um único executável com uma única versão.


9
Doce - essa é a resposta que eu estava procurando. Eu não queria uma coleção de DLLs. Cheers
CAD bloke

63
Por que você faria dessa maneira? É por isso que temos bibliotecas, encapsulamento. Não vejo senso comercial ou lógica sobre por que você faria isso.
Ryan Ternier

16
Além disso, seus links podem não estar sob o mesmo controle de fonte. Esta é uma sugestão muito perigosa.
Kugel

11
Existem situações em que esta solução é útil. Como exemplo, estou desenvolvendo no InfoPath 2007, onde não é fácil implantar uma DLL separada no SharePoint. Para compartilhar funcionalidades comuns entre os formulários do InfoPath, a abordagem do arquivo de classe vinculada é muito útil. Ele é colocado um nível acima dos projetos de formulários individuais e tudo é controlado pela origem no nível raiz.
Oliver Gray

6
Como outro exemplo de utilidade, diga que você está desenvolvendo dois aplicativos que precisam se comunicar. Um é de 64 bits e o outro é 32, portanto, você não deseja necessariamente que dlls separadas sejam criadas a partir do mesmo código para fazer referência a cada projeto. Dessa forma, você pode imitar a funcionalidade c do uso de um arquivo .h.
user912447

33

File > Add > Existing Project...permitirá adicionar projetos à sua solução atual. Apenas adicionando isso, pois nenhuma das postagens acima indica isso. Isso permite incluir o mesmo projeto em várias soluções.


1
Isso funciona; no lado negativo, ele não cria os dois projetos em uma montagem.
11556 Ian

24

Você pode incluir um projeto em mais de uma solução. Eu não acho que um projeto tenha um conceito de qual solução ele faz parte. No entanto, outra alternativa é criar a primeira solução em algum lugar conhecido e fazer referência aos binários compilados. Isso tem a desvantagem de que você precisará fazer um pouco de trabalho se desejar fazer referência a versões diferentes com base no fato de criar ou não em configurações de liberação ou depuração.

Não acredito que você possa fazer uma solução realmente depender de outra, mas você pode executar suas compilações automatizadas em uma ordem apropriada por meio de scripts personalizados. Trate basicamente sua biblioteca comum como se fosse outra dependência de terceiros, como NUnit etc.


O projeto tem um rastreamento de onde os pacotes de nuget estão armazenados e isso pode ser alterado pela abertura da solução, o que pode causar dores de cabeça no momento da construção, portanto, essa é uma solução preferível.
Shane Courtrille

23

Você pode fazer curingas embutidos usando a seguinte técnica (que é a maneira pela qual a solução do @ Andomar é salva no .csproj)

<Compile Include="..\MySisterProject\**\*.cs">
  <Link>_Inlined\MySisterProject\%(RecursiveDir)%(Filename)%(Extension)</Link>
</Compile>

Coloque em:

    <Visible>false</Visible>

Se você deseja ocultar os arquivos e / ou impedir que o curinga inclua a expansão, se você adicionar ou remover um item de uma pasta 'item existente virtual', como MySisterProjectacima.


Agradável. Parece uma solução leve e agradável, se você perdoar o trocadilho.
CAD bloke

@Cad cara: Com certeza funciona bem (como faz o trocadilho :), mas há muito a ser dito para fazer o máximo para evitar as ligações em primeiro lugar
Ruben Bartelink

2
@ CAD Bloke: Sim, esse é divertido. Apenas para maior clareza, direi explicitamente o seguinte, caso isso ajude alguém ... Você pode descarregar / recarregar um projeto para que ele faça as alterações. (Alt-P, L duas vezes). O problema do VS2010 é que os arquivos .targets, etc., editados nos arquivos .csproj, <Importsão armazenados em cache até você recarregar as soluções, como você diz.
Ruben Bartelink

3
Aqui está minha versão mais recente do tema curinga ... <Compilar Incluir = ".._ Src * *. " Excluir = ".._ Src \ Properties \ AssemblyInfo.cs; .._ Src \ bin * * .; .._ Src \ obj * * .; .._ Src ***. Csproj; .._ Src ***. Usuário; .._ Src ***. Vstemplate "> <Link> Src \% (RecursiveDir)% (nome do arquivo)% (extensão) < / Link> </Compile>
CAD cara

1
@ChrisK Aqui estão mais alguns esclarecimentos sobre minhas edições no arquivo csproj ... theswamp.org/index.php?topic=41850.msg472902#msg472902 . Eu apenas edito no Notepad ++. Quando eu o salvo, o VS vê que ele mudou e solicita uma recarga. Existem configurações no VS para controlar esse comportamento.
CAD bloke

18

Você simplesmente criaria um projeto separado da Biblioteca de Classes para conter o código comum. Ele não precisa fazer parte de nenhuma solução que o utilize. Faça referência à biblioteca de classes de qualquer projeto que precise.

O único truque é que você precisará usar uma referência de arquivo para fazer referência ao projeto, pois ele não fará parte das soluções que se referem a ele. Isso significa que o conjunto de saída real deverá ser colocado em um local que possa ser acessado por qualquer pessoa que esteja criando um projeto que faça referência a ele. Isso pode ser feito colocando a montagem em um compartilhamento, por exemplo.


Eu acho que se eu criar um evento de compilação e publicar a dll para a pasta _lib controlado de origem no projeto de referência, em seguida, verificar em que DLL que iria funcionar .. parece tipo de tho hacky ..
hanzolo

1
Se você deseja controlar a origem de todas as compilações, é possível que um destino de compilação verifique as DLLs da biblioteca, copie as saídas da compilação para as pastas da biblioteca e faça o check-in das DLLs.
John Saunders

8

Você pode incluir o mesmo projeto em mais de uma solução, mas é garantido que há problemas no futuro (caminhos relativos podem se tornar inválidos quando você move diretórios, por exemplo)

Depois de anos lutando com isso, finalmente cheguei a uma solução viável, mas exige que você use o Subversion para controle de fonte (o que não é uma coisa ruim)

No nível do diretório da sua solução, adicione uma propriedade svn: externals apontando para os projetos que você deseja incluir na sua solução. O Subversion extrairá o projeto do repositório e o armazenará em uma subpasta do seu arquivo de solução. Seu arquivo de solução pode simplesmente usar caminhos relativos para se referir ao seu projeto.

Se eu encontrar mais tempo, explicarei isso em detalhes.


Ao definir seus projetos, use apenas caminhos relativos ... Isso deve, especialmente para um reutilizável, resolver mais do que um pequeno problema.
Xtofl 12/07/2009

5
Apenas para referência, svn:externalslinks físicos para um repositório. Quando você move o repositório, os links externos ainda apontam para o repositório antigo.
Andomar

Para o git, você pode usar o SubTree SVN: equivalente externo no GIT?
Michael Freidgeim

8

Extraia o código comum em um projeto de biblioteca de classes e adicione esse projeto de biblioteca de classes às suas soluções. Em seguida, você pode adicionar uma referência ao código comum de outros projetos, adicionando uma referência de projeto a essa biblioteca de classes. A vantagem de ter uma referência de projeto em oposição a uma referência de binário / montagem é que, se você alterar sua configuração de compilação para depuração, liberação, customização etc., o projeto da biblioteca de classes comuns também será construído com base nessa configuração.


5

É uma boa idéia criar uma biblioteca de classes DLL que contenha todas as funcionalidades comuns. Cada solução pode fazer referência a essa DLL independentemente, independentemente de outras soluções.

De fato, é assim que nossas fontes estão organizadas em meu trabalho (e acredito em muitos outros lugares).

A propósito, a Solução não pode depender explicitamente de outra solução.


1
Acredito que esse seja um dos maiores pontos da questão que obviamente muitas pessoas não entendem.
Del Lee

5

Duas etapas principais envolvidas são

1- Criando uma DLL C ++

No visual studio

New->Project->Class Library in c++ template. Name of project here is first_dll in 
visual studio 2010. Now declare your function as public in first_dll.h file and 
write the code in first_dll.cpp file as shown below.

Código do arquivo de cabeçalho

// first_dll.h

using namespace System;

namespace first_dll 
{

public ref class Class1
{
public:
    static double sum(int ,int );
    // TODO: Add your methods for this class here.
};
}

Arquivo Cpp

//first_dll.cpp
#include "stdafx.h"

#include "first_dll.h"

namespace first_dll
{

    double Class1:: sum(int x,int y)
    {
        return x+y;
    }

 }

Verifique isto

**Project-> Properties -> Configuration/General -> Configuration Type** 

essa opção deve ser Biblioteca Dinâmica (.dll) e criar a solução / projeto agora.

O arquivo first_dll.dll é criado na pasta Debug

2- Vinculando-o no projeto C #

Projeto C # aberto

Rightclick on project name in solution explorer -> Add -> References -> Browse to path 
where first_dll.dll is created and add the file.

Adicione esta linha na parte superior do projeto C #

Using first_dll; 

Agora, a função dll pode ser acessada usando a instrução abaixo em alguma função

double var = Class1.sum(4,5);

Criei dll no projeto c ++ no VS2010 e usei-o no projeto VS2013 C #. Funciona bem.



4

Se você estiver tentando compartilhar código entre dois tipos diferentes de projetos (ou seja: projeto de área de trabalho e projeto móvel), consulte a pasta de soluções compartilhadas . Eu tenho que fazer isso no meu projeto atual, pois os projetos para dispositivos móveis e computadores exigem classes idênticas que estão apenas em um arquivo. Se você seguir esse caminho, qualquer um dos projetos que tiverem o arquivo vinculado poderá fazer alterações e todos os projetos serão reconstruídos com base nessas alterações.


Como isso funciona Stevoni? Você poderia fornecer mais informações?
91311 Steve Dunn

@SteveDunn Publiquei um tutorial no meu blog muito raramente atualizado (escola e trabalho estúpidos atrapalham a coisa divertida da vida). Pode ser encontrado aqui
Stevoni

4

Há um bom argumento para usar "adicionando links de arquivos existentes" ao reutilizar código em projetos e é quando você precisa fazer referência e oferecer suporte a diferentes versões de bibliotecas dependentes.

Não é fácil fazer vários assemblies com referências a diferentes assemblies externos, sem duplicar o código ou utilizar truques com controle de código-fonte.

Eu acredito que é mais fácil manter um projeto para desenvolvimento e teste de unidade e, em seguida, criar projetos de 'construção' usando links de arquivos existentes quando você precisar criar os assemblies que fazem referência a versões diferentes desses assemblies externos.


2

Uma maneira mais simples de incluir um arquivo de classe de um projeto em outros projetos é Adicionando o projeto na solução existente e Adicionando a referência DLL do novo projeto no projeto existente. Finalmente, você pode usar os métodos da classe adicionada decalcando usando diretiva na parte superior de qualquer classe.


2

A partir do VisualStudio 2015, se você mantiver todo o seu código em uma solução, poderá compartilhar o código adicionando um projeto compartilhado . Em seguida, adicione uma referência a este projeto compartilhado para cada projeto em que você deseja usar o código, bem como as diretrizes de uso adequadas.


2

Agora você pode usar o Projeto Compartilhado

Projeto compartilhado é uma ótima maneira de compartilhar código comum em vários aplicativos. Já experimentamos o tipo de projeto compartilhado no Visual Studio 2013 como parte do Windows 8.1 Universal App Development, mas com o Visual Studio 2015, é um novo modelo de projeto independente; e podemos usá-lo com outros tipos de aplicativos, como console, desktop, telefone, aplicativo da loja etc. Este tipo de projeto é extremamente útil quando queremos compartilhar um código, lógica e componentes comuns em vários aplicativos em uma única plataforma . Isso também permite acessar as APIs específicas da plataforma, ativos etc.

insira a descrição da imagem aqui

para mais informações verifique isto

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.