Visual Studioのプロジェクト/ソリューション間でコードをどのように共有しますか?


229

いくつかの共通コードがある2つのソリューションがあるので、それを抽出してそれらの間で共有したいと思います。さらに、他の人に役立つ可能性があるため、そのライブラリを個別にリリースできるようにしたいと考えています。

  • Visual Studio 2008でそれを行うための最良の方法は何ですか?
  • プロジェクトは複数のソリューションに存在していますか?
  • 個別のコードに個別のソリューションはありますか?
  • ソリューションは別のソリューションに依存できますか?

15
その2014年。答えはNugetです。
Ravi

1
@Ravi自分のオフィスで開発されたVisual Studio Webアプリケーションをモジュール化したかったのですが、Visual Studio Webアプリケーションを別のWebアプリケーションにモジュール化しようとすると、コンポーネント間の循環依存関係が発生します。たとえば、依存関係が多すぎるため、計画された各WebアプリケーションのPOCOプロジェクトをモジュール化できません。Nugetを使用してモジュール化を支援する方法はありますか?
CSルイス

回答:


70

プロジェクトは複数のソリューションから参照できます。

ライブラリまたはコアコードを1つのプロジェクトに配置し、両方のソリューションでそのプロジェクトを参照します。


150
OK、でもどうやって?いくつかの指示?
cja 2013

2
この(古い)答えは、複数のアセンブリが生成されるため、それだけでは不完全です。ただし、ILMerge(特に内部化オプション)と組み合わせると、非常に強力なソリューションになります。
user2246674 2013年

2
@ user2246674:複数のアセンブリのためになぜ不完全なのですか?OPは単一のアセンブリについては何も述べていません。
John Saunders、

1
@Jfly:公開されていないものの名前を変更しても、外部コードには影響しません。公開されているものの名前を変更するの、共通コードを使用するすべてのプロジェクトと共通コード自体が単一のソリューション内にある場合にのみ行う必要があります。これらすべてのプロジェクトを含み、この目的でのみ使用される「マスター」ソリューションを手動で作成できます。
ジョンサンダース

1
それは、別のインスタンスが何を意味するかによって異なります。あなたはおそらく、いくつかの詳細で新しい質問を始めるのにうまくいくでしょう。
ilivewithian 2018年

248

2つのプロジェクト間でコードファイルを「リンク」できます。プロジェクトを右クリックし、Add->を選択Existing itemして、Addボタンの横にある下矢印をクリックします。

スクリーングラブ

私の経験では、リンクはライブラリを作成するよりも簡単です。リンクされたコードは、単一のバージョンの単一の実行可能ファイルになります。


9
甘い-それが私が探していた答えです。DLLのコレクションが欲しくありません。歓声
CADは、2011年

63
なぜこのようにするのですか?これが、ライブラリ、カプセル化がある理由です。なぜあなたがこれをするのか、私にはビジネスセンスも論理センスもありません。
Ryan Ternier、2011

16
さらに、リンクが同じソース管理下にない場合があります。これは非常に危険な提案です。
Kugel、

11
このソリューションが役立つ状況があります。例として、InfoPath 2007で開発を行っていますが、個別のDLLをSharePointに展開するのは簡単ではありません。InfoPathフォーム間で共通の機能を共有するには、リンクされたクラスファイルのアプローチが非常に役立ちます。個々のフォームプロジェクトの1つ上のレベルに配置され、すべてがルートレベルでソース管理されます。
Oliver Grey

6
もう1つの有用性の例として、相互に通信する必要のある2つのアプリケーションを開発しているとします。1つは64ビットで、もう1つは32ビットなので、同じコードからビルドされた個別のDLLが各プロジェクトから参照されることは必ずしも必要ではありません。この方法で、.hファイルを使用するc機能を模倣できます。
user912447

33

File > Add > Existing Project...現在のソリューションにプロジェクトを追加できます。上記のどの投稿もそれを指摘していないので、これを追加します。これにより、複数のソリューションに同じプロジェクトを含めることができます。


1
これは機能します。欠点は、両方のプロジェクトを1つのアセンブリにビルドしないことです。
Ian Boyd

24

あなたはすることができます1つのプロジェクトを複数のソリューションに含めるます。プロジェクトには、そのソリューションが含まれているという概念がないと思います。ただし、別の方法としては、最初のソリューションを既知の場所にビルドし、コンパイル済みのバイナリを参照する方法もあります。これには、リリース構成でビルドするかデバッグ構成でビルドするかに基づいて異なるバージョンを参照する場合に少し作業が必要になるという欠点があります。

あるソリューションを別のソリューションに実際に依存させることはできないと思いますが、カスタムスクリプトを使用して適切な順序で自動ビルドを実行できます。基本的に、共通ライブラリを、NUnitなどの別のサードパーティの依存関係であるかのように扱います。


プロジェクトにはnugetパッケージが保存されている場所が追跡されます。これは、ソリューションを開くことで変更でき、ビルド時に問題が発生する可能性があるため、これは望ましいソリューションです。
シェーンコートリル16

23

次の手法を使用して、ワイルドカードをインラインで使用できます(これは、@ Andomarのソリューションを.csprojに保存する方法です)。

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

入れて:

    <Visible>false</Visible>

MySisterProject上記のように「仮想の既存のアイテム」フォルダーにアイテムを追加または削除した場合に、ファイルを非表示にするか、ワイルドカードインクルードが展開されないようにする場合。


良いですね。駄洒落を許してしまうなら、これは見事で軽量なソリューションのようです。
CADは12年

@Cad bloke:それは確かに大丈夫です(あなたの駄洒落と同じように:)が、そもそもリンクを避けるために最善を尽くすことについてはたくさんあります
Ruben Bartelink

2
@CAD Bloke:はい、それは楽しいです。わかりやすくするために、誰かに役立つ場合に備えて、次のことを明示的に説明します...プロジェクトをアンロード/再ロードして、変更を反映させることができます。(Alt-P、L 2回)。VS2010の問題は、<Import.csprojファイルに編集された.targetsファイルなどが、ソリューションをリロードするまでキャッシュされることです。
Ruben Bartelink

3
これがワイルドカードテーマの最新バージョンです... <Compile Include = ".._ Src * *。 " Exclude = ".._ Src \ Properties \ AssemblyInfo.cs; .._ Src \ bin * *。; .._ Src \ obj * *。; .._ Src ***。csproj; .._ Src ***。user; .._ Src ***。vstemplate "> <Link> Src \%(RecursiveDir)%(Filename)%(Extension)< / Link> </ Compile>
CADが2012

1
@ChrisK次に、csprojファイルでの編集についての説明を示します... theswamp.org/index.php?topic=41850.msg472902#msg472902。Notepad ++で編集するだけです。保存すると、VSは変更されたことを確認し、再読み込みを要求します。この動作を制御するための設定がVSにあります。
CADは2013

18

単純に、共通コードを含む別のクラスライブラリプロジェクトを作成します。それを使用するソリューションの一部である必要はありません。それを必要とするプロジェクトからクラスライブラリを参照します。

唯一のトリックは、プロジェクトを参照するためにファイル参照を使用する必要があることです。これは、プロジェクトを参照するソリューションの一部ではないためです。つまり、実際の出力アセンブリは、それを参照するプロジェクトを構築する誰もがアクセスできる場所に配置する必要があります。これは、たとえば、アセンブリを共有に配置することで実行できます。


ビルドイベントを作成し、dllを参照元プロジェクトのソース管理された_libフォルダーに公開し、そのDLLをチェックインすると、動作するように見える..一種の
ハッキリ

1
すべてのビルドをソース管理する場合は、ビルドターゲットでライブラリdllをチェックアウトし、ビルド出力からライブラリフォルダーにコピーして、dllをチェックインできます。
ジョンサンダース

8

同じプロジェクトを複数のソリューションに含めることもできますが、将来、問題が発生することが保証されます(たとえば、ディレクトリを移動すると相対パスが無効になる場合があります)。

何年もこれに苦労した後、ようやく実用的なソリューションを思いつきましたが、ソース管理にSubversionを使用する必要があります(これは悪いことではありません)。

ソリューションのディレクトリレベルで、ソリューションに含めるプロジェクトを指すsvn:externalsプロパティを追加します。Subversionはリポジトリからプロジェクトをプルし、ソリューションファイルのサブフォルダーに保存します。ソリューションファイルでは、相対パスを使用してプロジェクトを参照できます。

時間があれば、詳しく説明します。


プロジェクトを定義するときは、相対パスのみを使用するようにしてください...特に再利用可能なパスの場合、これは小さな問題以上のものを解決するはずです。
xtofl 2009

5
参考svn:externalsまでに、リポジトリへのハードリンク。リポジトリを移動しても、外部リンクは引き続き古いリポジトリを指しています。
Andomar 2010


8

共通コードをクラスライブラリプロジェクトに抽出し、そのクラスライブラリプロジェクトをソリューションに追加します。次に、そのクラスライブラリにプロジェクト参照を追加することにより、他のプロジェクトからの共通コードへの参照を追加できます。バイナリ/アセンブリ参照ではなくプロジェクト参照を使用する利点は、ビルド構成をデバッグ、リリース、カスタムなどに変更した場合、共通のクラスライブラリプロジェクトがその構成に基づいてビルドされることです。


5

すべての一般的な機能を含むdllクラスライブラリを作成することをお勧めします。各ソリューションは、他のソリューションに関係なく、このDLLを独立して参照できます。

実際、これは私たちの情報源が私の仕事の中で編成されている方法です(そして私は他の多くの場所を信じています)。

ところで、ソリューションは明示的に別のソリューションに依存することはできません。


1
これは、明らかに多くの人が理解できない問題の最大のポイントの1つだと思います。
デルリー

5

関連する2つの主なステップは

1- C ++ dllの作成

ビジュアルスタジオで

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.

ヘッダーファイルコード

// 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.
};
}

Cppファイル

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

#include "first_dll.h"

namespace first_dll
{

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

 }

これをチェックして

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

このオプションはダイナミックライブラリ(.dll)で、ソリューション/プロジェクトを今すぐビルドする必要があります。

first_dll.dllファイルがDebugフォルダーに作成されます

2- C#プロジェクトでリンクする

C#プロジェクトを開く

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

この行をC#プロジェクトの一番上に追加します

Using first_dll; 

DLLからの関数は、いくつかの関数で以下のステートメントを使用してアクセスできます

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

私はVS2010のc ++プロジェクトでdllを作成し、それをVS2013 C#プロジェクトで使用しました。



4

2つの異なるプロジェクトタイプ(つまり、デスクトッププロジェクトとモバイルプロジェクト)の間でコードを共有しようとしている場合は、共有ソリューションフォルダーを調べることができます。現在のプロジェクトでは、モバイルプロジェクトとデスクトッププロジェクトの両方で、1つのファイルだけにある同一のクラスが必要であるため、これを行う必要があります。この方法を使用すると、ファイルがリンクされているプロジェクトのいずれかが変更を加えることができ、すべてのプロジェクトがそれらの変更に対して再構築されます。


ステボニはどのように機能しますか?詳細を教えていただけますか?
Steve Dunn

@SteveDunn私は自分のめったに更新されないブログにハウツーを投稿しました(愚かな学校と仕事が人生の楽しいことの邪魔になる)。それはここ
Stevoni

4

プロジェクト間でコードを再利用する場合、「既存のファイルリンクの追加」を使用する非常に良いケースがあります。これは、異なるバージョンの依存ライブラリを参照してサポートする必要がある場合です。

異なる外部アセンブリへの参照を使用して複数のアセンブリを作成することは、コードを複製したり、ソースコード管理でトリックを利用したりすることなく、簡単に行うことはできません。

開発と単体テストのために1つのプロジェクトを維持し、それらの外部アセンブリの異なるバージョンを参照するアセンブリを作成する必要がある場合は、既存のファイルリンクを使用して「ビルド」プロジェクトを作成するのが最も簡単だと思います。


2

あるプロジェクトのクラスファイルを別のプロジェクトに含める1つの簡単な方法は、既存のソリューションにプロジェクトを追加してから、既存のプロジェクトに新しいプロジェクトのDLL参照を追加することです。最後に、追加したクラスのメソッドを使用するには、anyクラスの先頭でusingディレクティブを宣言します。


2

VisualStudio 2015以降、すべてのコードを1つのソリューションに保持する場合、共有プロジェクトを追加してコードを共有できます。次に、コードを使用する各プロジェクトのこの共有プロジェクトへの参照と、適切なusingディレクティブを追加します。


2

これで、共有プロジェクトを使用できます

共有プロジェクトは、複数のアプリケーション間で共通のコードを共有する優れた方法です。Windows8.1ユニバーサルアプリ開発の一環としてVisual Studio 2013で共有プロジェクトタイプを使用した経験はありますが、Visual Studio 2015ではスタンドアロンの新しいプロジェクトテンプレートです。コンソール、デスクトップ、電話、ストアアプリなどの他のタイプのアプリで使用できます。このタイプのプロジェクトは、単一のプラットフォームで複数のアプリケーション間で共通のコード、ロジック、コンポーネントを共有する場合に非常に役立ちます。これにより、プラットフォーム固有のAPIやアセットなどにアクセスすることもできます。

ここに画像の説明を入力してください

詳細はこちらをチェック

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.