【问题标题】:How to use a class from one C# project with another C# project如何将一个 C# 项目中的类与另一个 C# 项目一起使用
【发布时间】:2011-04-03 01:12:44
【问题描述】:

在同一个解决方案中,我有两个项目:P1 和 P2。如何在 P2 中使用 P1 的一个类?

【问题讨论】:

  • 非常相似的问题here

标签: c# visual-studio


【解决方案1】:

只需从 P2 添加对 P1 的引用

【讨论】:

  • 如果类是非公开的或者如果 P2 是 P1 的朋友,这将不起作用。
  • 在这种情况下,您有 3 个选项:1) 合并 2 个项目 2) 将类设为内部 - 并将 P2 添加为“InternalsVisibleTo”属性(更多信息:msdn.microsoft.com/en-us/library/…)。 3)如果以上都不能完成 - 你将不得不使用反射来实例化并从 P2 调用类 P1
  • 我希望得到更详尽的答案。这个感觉几乎是讽刺的。
  • 举个例子会更好。
  • 另外,两个项目都需要针对相同的 .NET 框架。在“应用程序”选项卡上检查每个项目的属性,应该有一个“目标框架”。两个项目都需要在这里定位相同的框架。
【解决方案2】:

在项目 P1 中公开该类(如果尚未公开)。然后将项目引用(而不是文件引用,我偶尔遇到的错误)添加到 P2。在 P2 的正确位置添加 using 语句,并开始使用 P1 中的类。

(要提到这一点:公开课程的替代方法是让 P2 成为 P1 的朋友。但是,这不太可能是您想要的答案,因为它会产生一些后果。所以坚持以上建议。)

【讨论】:

    【解决方案3】:
    1. 在“解决方案资源管理器”树中,展开 P2 项目,右键单击 (Shift+F10)“依赖项”节点并选择“添加项目引用”。 ..'。
    2. 在“添加参考”对话框中,选择您的 P1 项目。
    3. 如果您使用命名空间,则需要通过在 P2 中的文件中添加“使用”语句来导入 P1 类型的命名空间。

    请注意,您希望直接访问的 P1 中的类型必须具有足够的访问级别:通常这意味着它们必须公开。


    注意:如果您正在处理较旧的项目(例如 .NET Framework),您可能没有“依赖项”节点。在这种情况下,右键单击项目并从菜单中选择“添加引用”,然后确保选择左侧的“项目”选项卡。

    【讨论】:

    • 很好的建议,先生。我曾经粘贴链接,但每次更改文件路径时都必须更新它们。有了项目参考,一切就容易多了。谢谢!
    • 如果您已经在 P1 中引用了 P2 怎么办?执行上述操作会产生“循环依赖”...
    • @colmde 是的。您必须将要共享的元素抽象到第三个项目中,您可以想象将其命名为 P3,其他两个项目引用它。
    • 作为非 NET 开发人员,我真的认为这应该是公认的答案...谢谢 Paul (x2)
    【解决方案4】:

    第一步是通过执行以下操作使 P2 引用 P1

    • 右键单击项目并选择“添加引用”
    • 转到“项目”选项卡
    • 选择 P1 并点击确定

    接下来,您需要确保 P1 中的类可供 P2 访问。最简单的方法是让他们public

    public class MyType { ... }
    

    现在您应该可以通过它们的完全限定名称在 P2 中使用它们了。假设 P1 的命名空间是 Project1,那么以下将起作用

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

    不过,首选的方法是为 Project1 添加一个 using,这样您就可以在没有限定条件的情况下使用这些类型

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

    【讨论】:

      【解决方案5】:

      如果您在一个解决方案文件夹中有两个项目。只需将项目的引用添加到另一个中。使用命名空间您可以获得类。在为所需的类创建对象时。调用你想要的方法。

      第一个项目:

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

      这里添加对第二个项目的引用

      第二个项目:

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

      【讨论】:

        【解决方案6】:

        Paul Ruane 是正确的,我刚刚尝试自己构建该项目。 我只是做了一个完整的 SLN 来测试它是否有效。

        我在 VC# VS2008 中制作了这个

        第一步:

        制作名为 DoubleProject 的解决方案

        第二步:

        在名为 DoubleProjectTwo 的解决方案中创建项目(为此选择解决方案文件,右键单击 --> 添加 --> 新项目)

        我现在在同一个解决方案中有两个项目

        第三步:

        正如保罗·鲁安所说。转到解决方案资源管理器中的引用(如果关闭,它位于编译器的视图选项卡中)。 DoubleProjectTwo 是 DoubleProject 需要的功能/方法,所以在 DoubleProjectTwo 鼠标右键参考那里 --> 添加 --> 项目 --> DoubleProject。

        第四步:

        包括指令 命名空间:

        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();
                }
            }
        }
        

        第五步:

        制作一些东西给我证明 结果:

        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();
                }
            }
        }
        

        这应该可以解决问题

        希望对你有帮助

        EDIT::: whoops 忘记了实际更改字符串的方法调用,不要这样做:)

        【讨论】:

          【解决方案7】:

          假设您在项目 2 中的班级名为 MyClass。

          显然,首先在项目 1 中的引用下引用您的项目 2,然后

          using namespaceOfProject2;
          
          // for the class calling bit:
          
          namespaceOfProject2.MyClass project2Class = new namespaceOfProject2.MyClass();
          

          因此,每当您想引用该类时,您都可以键入 project2Class。还要确保该课程也是公开的。

          【讨论】:

            【解决方案8】:

            新开发人员经常会问这个简单的问题,这是 Visual Studio IDE 的常见问题。很少有人回答具体问题,并且经常批评问题或对无法回答常见问题的解决方案进行“猜测”。第一个常见问题是 IDE 引导您创建新项目,而不是向现有解决方案添加新文件(.java、.py、.cpp、.c)(默认情况下它会创建新解决方案),除非您更改项目名称并添加到当前解决方案中。 Python、java、c#、C++ 和 C 项目文件夹会出现此问题。

            新开发者选择“新建>项目>项目名称并将解决方案目录更改为“使用相同的解决方案”仍会在相同的解决方案空间中创建一个新的“项目”,但与当前用户界面不在相同的目录空间中文件或命令行文件在构建和运行项目或解决方案时仍然会导致“找不到包”错误的问题。这就是为什么上述关于导入包、类、方法和函数的编码建议只有效(因此不回答问题)当“库”文件或“单独行为”文件不仅在同一个解决方案目录路径中,而且在同一个“用户界面”或“命令外壳”应用程序目录空间中时。不会发生这种情况您使用 IDE 的 new>project>project type 命令添加另一个项目。这里的问题是新项目存储在与现有客户端或用户界面代码文件不同的目录中。要在同一目录中创建新的“文件”项目空间率与新项目相比,初学者需要做以下微软不会为你做的事情,甚至会误导你远离默认的直观显而易见的事情。

            1. 选择要将新行为导入到的“应用程序”(从另一个文件)
            2. 选择项目>添加新项目
            3. 选择“程序文件模板类型”,例如 filetype.py、filetype.java、filetype.c、filetype.cpp、filetype.C# 等或库类文件类型(您看到的启动文件选项以外的其他内容)当您创建新的应用程序项目或创建新的库项目时)。
            4. 在您的项目中创建一个具有默认名称的新文件名。
            5. 将文件的默认名称更改为 library.py 或 façade.java 等。

            现在,导入库或使用命名空间的代码建议将按照上述 cmets 中的说明工作,您不必更改路径语句或更改 Microsoft 不允许您轻松更改的解决方案路径和解决方案名称(即您可以更改文件名或项目名称,但 IDE 不会自动更改项目路径或解决方案路径名称)。

            以下是一个 Python 示例,但对于 C#、java 或 C/C++ 的工作方式类似,使用包含、命名空间或使用适用于每种语言的代码命令在相同目录空间中的其他类/项目中查找代码。

            从同目录下其他代码文件导入的应用程序文件“hello world”。

            请注意,python 空白分隔符不会在此 stackoverflow 注释编辑器中正确分隔:

            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. 该引用现在可供解释器、代码检查器和/或编译器使用。

            好的,既然您已经解决了这个问题,那么您如何真正将两个单独的项目链接到同一个解决方案空间中?

            1. 您必须同时访问索引器或“intellisense”选项以及编译器/解释器,并实际检查或更改/添加目录路径语句,如果它们不是指向“第二个”项目或解决方案空间的内容。当您更改路径或将路径变量更改为工作区和项目的特定位置时,编译器和代码分析器可以找到这些库、headers.h、命名空间、项目或文件位置。
            2. 要删除您错误创建的旧项目,情况会更糟。您必须退出 Visual Studio IDE,打开 Windows 资源管理器,转到工作区目录 ...documents\visualstudio xxx\solutionname\packagename 选择文件或文件夹,右键单击并“删除”文件或文件夹。
            3. 当您重新进入 IDE 并选择打开解决方案或打开包/解决方案时,旧文件和解决方案/包名称以及它们误导性的路径语句都会消失,这会欺骗编译器和代码分析器甚至查看旧目录尽管您更改了文件名并更改了项目名称,但它不会随之更改目录路径。

            Microsoft 确实非常需要解决这些问题,以便您可以直观地在同一目录中创建大多数人想要创建的新文件,并通过选择解决方案并将其从 IDE 中删除来删除解决方案。对于经验丰富的开发人员来说如此灵活的目录路径语句让初学者感到非常沮丧,但对于新开发人员的默认设置却如此不公平。

            希望这真的可以帮助新人,并阻止经验丰富的开发人员向您提供对您不起作用的错误答案。他们假设您已经理解路径语句并且只想输入正确的代码......这也是为什么隧道尝试更正您的代码但不能帮助您解决问题的原因。这可能是 stackoverflow 上不断描述的最常见的问题,错误的答案不适用于新程序员。

            【讨论】:

            • 总结这个答案(对于 VS 2017):在解决方案资源管理器中右键单击 P1 >>> 添加... >>> 参考... >>> 项目 >>> 解决方案 >>> 检查P2 复选框。
            【解决方案9】:

            我遇到了不同目标框架的问题。

            我做的一切都是正确的,但无法使用 P2 中的引用。 在我为 P1 和 P2 设置相同的目标框架后,它就像一个魅力。

            希望对大家有所帮助

            【讨论】:

            • 我遇到了同样的问题,出现了诸如The name ... does not exist in the current context. Cannot resolve symbol ... 之类的错误,直到我更改了项目的目标框架以匹配。 (右键单击项目并转到 Project -&gt; Properties -&gt; Target framework 以更改此设置。)
            【解决方案10】:

            提供另一个更简单的解决方案:-

            1. 在项目中,右键单击并选择“添加 -> 现有”
            2. 导航到相邻项目中的类文件。
            3. 添加按钮也是一个下拉菜单,点击下拉菜单并选择

            “添加为链接”

            就是这样。

            【讨论】:

              【解决方案11】:

              您需要右键单击您的项目并选择add -&gt; Reference... -&gt; Projects 并勾选您要引用的项目。

              此结果应在项目树的引用部分下显示引用的项目。

              一个常见的用例包括向您的解决方案添加一个测试框架,例如一个 NUnit 项目。然后,这个 NUnit 项目将需要引用您的主项目。为此,步骤略有不同: 您需要右键单击您的 NUnit 项目并选择 add -&gt; Project Reference... -&gt; Projects 并勾选您要引用的项目。

              此结果应在 NUnit 项目树的“项目”部分下显示引用的项目。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2022-01-23
                • 2011-01-19
                • 1970-01-01
                • 1970-01-01
                • 2014-02-08
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多