あるC#プロジェクトのクラスを別のC#プロジェクトで使用する方法


回答:


65

P2からP1への参照を追加するだけです


12
クラスが非公開である場合、またはP2がP1のフレンドである場合、これは機能しません。
Manfred

7
この場合、3つのオプションがあります。1)2つのプロジェクトを組み合わせる2)クラスを内部にする-P2を "InternalsVisibleTo"属性として追加します(詳細については、msdn.microsoft.com / en-us / library / )。3)上記のいずれも実行できない場合-リフレクションを使用してクラスP1をインスタンス化し、P2から呼び出す必要があります
Nissim

21
私はもっ​​と手の込んだ答えを好んだでしょう。これはほとんど皮肉な感じです。
シュティーベン

5
例はもっと良かったでしょう。
ポールアレクサンダー

1
また、両方のプロジェクトが同じ.NETフレームワークをターゲットにする必要があります。「アプリケーション」タブで各プロジェクトのプロパティを確認します。「ターゲットフレームワーク」があるはずです。ここでは両方のプロジェクトで同じフレームワークをターゲットにする必要があります。
トラビス

192
  1. 「ソリューションエクスプローラー」ツリーでP2プロジェクトを展開し、プロジェクトを右クリックして、メニューから「参照の追加」を選択します。
  2. [参照の追加]ダイアログで[プロジェクト]タブを選択し、P1プロジェクトを選択します。
  3. 名前空間を使用している場合は、P2のファイルに「using」ステートメントを追加して、P1タイプの名前空間をインポートする必要があります。

直接アクセスするP1のタイプには十分なアクセスレベルが必要であることに注意してください。通常、これはそれらを公開する必要があることを意味します。


素晴らしいアドバイスです 以前はリンクを貼り付けていましたが、ファイルのパスを変更するたびにリンクを更新する必要がありました。プロジェクト参照を使用すると、すべてがはるかに簡単になります。ありがとうございました!
IneedHelp

2
P1のP2への参照がすでにある場合はどうなりますか?上記を実行すると、「循環依存」が発生します...
colmde

4
@colmdeはいそうです。共有する要素を3つ目のプロジェクトに抽象化し、他の2つのプロジェクトで参照されるP3に想像上のタイトルを付けることができます。
Paul Ruane、2015

非NET開発者として、私はこれが受け入れられる答えであると本当に思っています...ありがとうPaul(x2)
thisIsTheFoxe

16

Paul Ruaneは正解です。私は自分でプロジェクトを構築しようとしました。SLN全体を作成して、機能するかどうかをテストしました。

私はVC#VS2008でこれを作りました

<<(これを()コメントで読む他の人々を助けるだけ)

ステップ1:

DoubleProjectと呼ばれるソリューションを作成する

ステップ2:

DoubleProjectTwoという名前のソリューションでプロジェクトを作成します(これを行うには、ソリューションファイルを選択し、右クリック->追加->新しいプロジェクト)

同じソリューションに2つのプロジェクトがあります

ステップ3:

ポール・ルアンが述べたように。ソリューションエクスプローラーの参照に移動します(閉じている場合は、コンパイラーの[表示]タブにあります)。DoubleProjectTwoは、DoubleProjectの関数/メソッドを必要とするものであるため、DoubleProjectTwoの右マウスリファレンスで->追加->プロジェクト-> DoubleProjectを選択します。

ステップ4:

名前空間のディレクティブを含めます。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DoubleProject; <------------------------------------------

namespace DoubleProjectTwo
{
    class ClassB
    {
        public string textB = "I am in Class B Project Two";
        ClassA classA = new ClassA();


        public void read()
        {
            textB = classA.read();
        }
    }
}

ステップ5:

結果を証明するものを見せてください:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DoubleProject
{
    public class ClassA    //<---------- PUBLIC class
    {
        private const string textA = "I am in Class A Project One";

        public string read()
        {
            return textA;
        }
    }
}

メイン

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DoubleProjectTwo;  //<----- to use ClassB in the main

namespace DoubleProject
{
    class Program
    {
        static void Main(string[] args)
        {
            ClassB foo = new ClassB();

            Console.WriteLine(foo.textB);
            Console.ReadLine();
        }
    }
}

トリックをすべきです

お役に立てれば

編集::: whoopsは実際に文字列を変更するためのメソッド呼び出しを忘れました、同じことをしないでください:)


9

新しい開発者がこの単純な質問をすることがよくありますが、これは特にVisual Studio IDEに共通の問題です。特定の質問に答え、よくある質問に答えたり、よくある問題に答えない解決策を「推測」したりする人はほとんどいません。最初の一般的な問題は、プロジェクト名を変更しない限り、IDEが新しいファイル(.java、.py、.cpp、.c)を既存のソリューションに追加するのではなく、新しいプロジェクトを作成することです(デフォルトでは、新しいソリューションが作成されます)。現在のソリューションに追加します。この問題は、Python、java、c#、C ++、およびCプロジェクトフォルダーで発生します。

IDEのnew> project> project typeコマンドを使用して別のプロジェクトを追加する場合、これは発生しません。ここでの問題は、新しいプロジェクトが既存のクライアントまたはユーザーインターフェイスのコードファイルとは別のディレクトリに保存されていることです。新しいプロジェクトではなく、同じプロジェクトスペースに新しい「ファイル」を作成するには、初心者はMicrosoftが実行しない次のことを行う必要があり、デフォルトでは直感的に明らかなものから離れてしまいます。

  1. (別のファイルから)新しい動作をインポートする「アプリケーション」を選択します
  2. プロジェクトを選択>新しいアイテムを追加
  3. filetype.py、filetype.java、filetype.c、filetype.cpp、filetype.C#などの「プログラムファイルテンプレートタイプ」またはライブラリクラスファイルタイプ(作成時に表示される起動ファイルオプション以外のもの)を選択します。新しいアプリケーションプロジェクトまたは新しいライブラリプロジェクトを作成します)。
  4. デフォルトの名前の新しいファイル名がプロジェクトに作成されます。
  5. ファイルのデフォルト名をlibrary.pyまたはfaçade.javaなどに変更します。

これで、ライブラリのインポートまたは名前空間の使用に関するコードの推奨事項は上記のコメントで説明されているように機能し、Microsoftが簡単に変更できないパスステートメントやソリューションパスとソリューション名を変更する必要はありません(つまり、ファイル名またはプロジェクト名ですが、IDEはプロジェクトパスまたはソリューションパス名を自動的に変更しません)。

以下はPythonの例ですが、C#、java、またはC / C ++でinclude、namespaces、または各言語に適したコードコマンドを使用して同じディレクトリスペースの他のクラス/プロジェクトでコードを検索する場合と同様に機能します。

同じディレクトリ内の他のコードファイルからインポートするアプリケーションファイル「hello world」。

このスタックオーバーフローコメントエディターでは、pythonの空白区切り文字が正しくスペースに入れられないことに注意してください。

print ("test")

from CIXMPythonFacade import ClassA

c1=ClassA
c1.methodA()

from CIXMPythonFacade import functionA 

functionA()


class ClassName(object): 
         def __init__(object, parameter):
         object.parameter = value

インポートするクラス、メソッド、または関数を含むライブラリファイルまたは「ファサード」ファイル。

class class1(object):
    """description of class"""

class ClassA(object):
    print ("test2")
    def methodA():
        print ("test3")

def functionA ():
    print ("test4")
    return (0)


pass

今、IDEがあなたを導く混乱を実際にどのように解決しますか?同じディレクトリスペース内の別のファイルからコードをインポートするには、そのファイルへの参照を追加します。

  1. アプリケーションファイルを選択します
  2. [プロジェクト]> [参照の追加]を選択します
  3. 正しいディレクトリパスで表示されるファイル名を選択してください(チェックしてください)
  4. これで、リファレンスがインタープリター、コードチェッカー、コンパイラー、あるいはその両方で使用できるようになります。

この問題を解決したので、2つの別々のプロジェクトを同じソリューション空間で実際にどのようにリンクしますか?

  1. インデクサーまたは「インテリセンス」オプションとコンパイラー/インタープリターの両方に移動し、「2番目」のプロジェクトまたはソリューションスペースを指すもの以外の場合は、ディレクトリパスステートメントを物理的にチェックまたは変更/追加する必要があります。パスを変更するか、ワークスペースと異なるディレクトリスペースであるプロジェクトの特定の場所にパス変数を変更すると、コンパイラとコードアナライザーはこれらのライブラリ、headers.h、名前空間、プロジェクト、またはファイルの場所を見つけることができます。
  2. 誤って作成した古いプロジェクトを削除するのはさらに悪いことです。Visual Studio IDEを終了し、Windowsエクスプローラーを開き、ワークスペースディレクトリに移動します... documents \ visualstudio xxx \ solutionname \ packagenameファイルまたはフォルダーを選択し、右クリックしてファイルまたはフォルダーを「削除」します。
  3. IDEを再起動して、ソリューションを開くまたはパッケージ/ソリューションを開くを選択すると、古いファイルとソリューション/パッケージの名前が消えてしまいます。ファイル名とプロジェクト名を変更した場合、ディレクトリパスは変更されません。

Microsoftはこれらの問題を本当に修正する必要があるため、ほとんどの人が新しいファイルとして作成したいものを同じディレクトリに直感的に作成し、ソリューションを選択してIDEから削除することでソリューションを削除できます。初心者は、熟練した開発者には非常に柔軟なディレクトリパスステートメントに非常に不満を感じますが、デフォルトでは新しい開発者には不公平です。

これが本当にあなたの新しい人を助け、熟練した開発者があなたのためにうまくいかない間違った答えを与えるのを止めることを願っています。彼らはあなたがすでにパスステートメントを理解していて正しいコードをタイプしたいだけだと仮定しています...それはまた、あなたのコードを修正しようとするトンネルがあなたの問題を修正するのを助けない理由でもあります。これはおそらく、スタックオーバーフローで継続的に説明される最も一般的な問題であり、新しいプログラマーには機能しない誤った回答が含まれます。


この回答を要約するには(VS 2017の場合):ソリューションエクスプローラーでP1を右クリック>>>追加... >>>参照... >>>プロジェクト>>>ソリューション>>> P2チェックボックスをオンにします。
Andrew pate

7

最初のステップは、次のようにしてP2をP1に参照することです。

  • プロジェクトを右クリックし、「参照の追加」を選択します
  • [プロジェクト]タブに移動します
  • P1を選択して[OK]をクリックします

次に、P1のクラスがP2からアクセス可能であることを確認する必要があります。最も簡単な方法はそれらを作ることpublicです。

public class MyType { ... }

これで、完全修飾名を使用してそれらをP2で使用できるようになります。P1の名前空間がProject1であるとすると、次のように機能します

Project1.MyType obj = new Project1.MyType();

ただし、使用方法を追加して、Project1修飾なしでタイプを使用できるようにすることをお勧めします。

using Project1;
...

public void Example() {
  MyType obj = new MyType();
}

5

1つのソリューションフォルダーに2つのプロジェクトがある場合、名前空間を使用してプロジェクトの参照を別のプロジェクトに追加するだけで、クラスを取得できます。必要なクラスのオブジェクトを作成している間。必要なメソッドを呼び出します。

FirstProject:

class FirstClass()
{
   public string Name()
   {
      return "James";
   }
}

ここに2番目のプロジェクトへの参照を追加します

SecondProject:

class SeccondClass
{
    FirstProject.FirstClass obj=new FirstProject.FirstClass();
    obj.Name();
}

4

プロジェクトP1でクラスを公開します(まだ公開されていない場合)。次に、プロジェクト参照(ファイル参照ではなく、たまに遭遇する間違い)をP2に追加します。P2のusingステートメントを正しい場所に追加し、P1のクラスの使用を開始します。

(これについて言及する:クラスをパブリックにする代わりに、P2をP1の友達にすることもできます。しかし、これは結果をもたらす可能性があるため、あなたが求める答えになる可能性は低いので、上記の提案に固執してください。)


2

プロジェクト2のクラスの名前がMyClassだとします。

明らかに、最初にプロジェクト1の参照の下でプロジェクト2を参照し、次に

using namespaceOfProject2;

// for the class calling bit:

namespaceOfProject2.MyClass project2Class = new namespaceOfProject2.MyClass();

そのため、そのクラスを参照する場合は常に、project2Classと入力します。さらに、クラスもパブリックであることを確認してください。


1

さまざまなターゲットフレームワークで問題が発生しました。

私はすべてを正しく行っていましたが、P2で参照を使用できませんでした。P1とP2に同じターゲットフレームワークを設定した後、それは魅力のように機能しました。

それが誰かを助けることを願って


同じ問題がありましたThe name ... does not exist in the current context. Cannot resolve symbol ...が、プロジェクトのターゲットフレームワークを一致するように変更するまでなどのエラーが発生しました。(プロジェクトを右クリックして、Project -> Properties -> Target frameworkこれを変更ためにます。)
ソニー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.