如何在一个C#项目和另一个C#项目中使用类


Answers:


65

只需从P2添加对P1的引用


12
如果课程是非公开的,或者如果P2是P1的朋友,则此方法将无效。
曼弗雷德

7
在这种情况下,您有3个选项:1)合并2个项目2)将类设置为内部-并将P2添加为“ InternalsVisibleTo”属性(此处提供更多信息:msdn.microsoft.com/zh-cn/library/…)。3)如果上述任何一项均无法完成,您将不得不使用反射实例化并从P2调用类P1
Nissim 2010年

21
我希望有一个更详尽的答案。这个人几乎感到讽刺。
shteeven

5
一个例子会更好。
保罗·亚历山大

1
同样,两个项目都需要针对相同的.NET框架。在“应用程序”选项卡上检查每个项目的属性,应该有一个“目标框架”。这两个项目都需要在此针对相同的框架。
特拉维斯

192
  1. 在“解决方案资源管理器”树中,展开P2项目,然后右键单击该项目,然后从菜单中选择“添加引用”。
  2. 在“添加引用”对话框中,选择“项目”选项卡,然后选择您的P1项目。
  3. 如果使用名称空间,则需要通过在P2中的文件中添加“ using”语句来导入P1类型的名称空间。

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


先生,很好的建议。我曾经粘贴链接,但是每次更改文件的路径时,我都必须更新它们。有了项目参考,一切都变得容易得多。谢谢!
IneedHelp 2012年

2
如果您已经在P1中引用了P2怎么办?执行上述操作将创建“循环依赖项” ...
colmde 2015年

4
@colmde是的。您必须将要共享的元素抽象到第三个项目中,您可以想象性地将其命名为P3,这是其他两个项目所引用的。
Paul Ruane 2015年

作为非.NET开发人员,我真的认为这应该是公认的答案...谢谢Paul(x2)
thisIsTheFoxe

16

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

我在VC#VS2008中做到了

<<(只是通过()注释帮助其他同时阅读此书的人)

第1步:

制作名为DoubleProject的解决方案

第2步:

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

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

第三步:

正如Paul Ruane所说。请转到解决方案资源管理器中的引用(如果关闭,则位于编译器的“视图”选项卡中)。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();
        }
    }
}

第五步:

让我看一下结果证明:

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

这应该够了吧

希望这可以帮助

编辑:::哎呀忘记了实际更改字符串的方法调用,不要这样做:)


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示例,但使用include,名称空间或使用适合每种语言的代码命令在SAME DIRECTORY SPACE中的其他类/项目中查找代码,对C#,java或C / C ++的工作原理相似。

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

请注意,在此stackoverflow注释编辑器中,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

包含要导入的类,方法或函数的库文件或“façade”文件。

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. 您必须同时使用indexer或“ intellisense”选项以及编译器/解释器,并物理检查或更改/添加目录路径语句(如果它们不是指向“第二”项目或解决方案空间的内容)。当您进行路径更改或将路径变量更改为工作空间以及项目的特定位置(它们是不同的目录空间)时,编译器和代码分析器便可以找到这些库,headers.h,名称空间,项目或文件位置。
  2. 要删除错误创建的旧项目,情况更糟。您必须退出Visual Studio IDE,打开Windows资源管理器,转到工作区目录... documents \ visualstudio xxx \ solutionname \ packagename选择文件或文件夹,右键单击并“删除”文件或文件夹。
  3. 当您重新进入IDE并选择打开解决方案或打开程序包/解决方案时,旧文件和解决方案/程序包名称都消失了,它们的误导路径语句也消失了,即使您已更改,它们也使编译器和代码分析器无法查看旧目录文件名并更改了项目名称,它不会更改目录路径。

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

希望这确实对您有所帮助,并阻止经验丰富的开发人员为您提供错误的答案,而这些答案对您不起作用。他们假设您已经了解路径语句,只想键入正确的代码...这也是为什么试图更正代码但无法帮助您解决问题的原因。这可能是在stackoverflow上不断描述的最常见问题,错误答案对新程序员不起作用。


总结此答案(针对VS 2017):在解决方案资源管理器中右键单击P1 >>>添加... >>>参考... >>>项目>>>解决方案>>>选中P2复选框。
安德鲁·帕特

7

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

  • 右键单击该项目,然后选择“添加引用”
  • 转到项目标签
  • 选择P1,然后单击确定

接下来,您需要确保P2可以访问P1中的类。最简单的方法就是制作它们public

public class MyType { ... }

现在,您应该能够通过它们的完全限定名称在P2中使用它们。假设P1的名称空间是Project1,则可以执行以下操作

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

不过,首选方式是添加一个for,Project1这样您就可以不加限定地使用这些类型

using Project1;
...

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

5

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

FirstProject:

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

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

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更改。)
sonny
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.