【问题标题】:In C#, How Can I Use Public Class Members(Methods Or Variables) From Different Assembly在 C# 中,如何使用来自不同程序集的公共类成员(方法或变量)
【发布时间】:2015-08-21 14:25:39
【问题描述】:

我正在从 Tutorialspoint.com 进行 C# 封装。我读了这个

What is the difference between Public, Private, Protected, and Nothing?1
来自 Stackoverflow 的问题。我阅读了答案,并且理解了 teoric 中的访问说明符。现在我想在 Visual Studio 中用这个主题制作控制台应用程序。

公开

同一程序集或引用它的其他程序集中的任何其他代码都可以访问该类型或成员。

私人

类型或成员只能被同一类或结构中的代码访问。

受保护

类型或成员只能被同一类或结构中的代码或派生类中的代码访问。

内部

同一程序集中的任何代码都可以访问类型或成员,但不能从另一个程序集中访问。

受保护的内部

类型或成员可以被同一程序集中的任何代码访问,也可以被另一个程序集中的任何派生类访问。

具有公共访问说明符的变量或方法可以从相同的程序集和不同的程序集访问。但这个车站在内部描述上有所不同。内部类型变量和方法只能访问相同的程序集,但不能访问 C# 中的不同程序集。我想在 C# 中测试这个站。所以我创建了两个项目并在彼此之间调用方法或变量。

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

namespace TutorialsPoint.Encapsulation
{
   public class PublicEncapsulation
    {
        //member variables
        public double length;
        public double width;


        public double GetArea()
        {
            return length * width;
        }

        public void Display()
        {
            Console.WriteLine("Length: {0}", length);
            Console.WriteLine("Width: {0}", width);
            Console.WriteLine("Area: {0}", GetArea());
        }

    }
}

上面的代码是我的“PublicEncapsulation.cs”,我应该从其他程序集中调用它的成员。我的其他程序集项目的类是 Program.cs。我想从 Program.cs(其他程序集)连接 PublicEncapsulation.cs 的成员。如何在 c# 中从其他程序集执行此调用操作。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.CompilerServices;
using System.Collections;

namespace CallOtherAssemblyVariablesOrMethods
{
    class Program
    {
        static void Main(string[] args)
        {
            /*Call PublicEncapsulation.cs's members in there.*/
        }
    }
}

上面的类是 Program.cs。我想在这里调用其他 assembly PublicEncapsulation.cs 的成员。

【问题讨论】:

  • 嗯...我虽然它应该与 What is .Net Assembly 基于标题重复,但您的帖子清楚地表明您知道如何创建多个程序集...可能您需要更新标题(和可能显示代码而不是图像)。
  • "我应该从其他程序集中调用它的成员" 那么不要将它们标记为内部。我很难理解你想要什么。

标签: c# .net .net-assembly access-specifier class-members


【解决方案1】:

2 天前我有一个简单的问题。我用 Stackoverflow 解决了我的问题。我想看看内部访问说明符和公共访问说明符之间的区别。然后我创建了两个项目来看看它们的区别。如果我可以调用公共方法并且不能从其他程序集中调用内部方法,那么 C# 控制台应用程序支持理论知识。我想这样做。但我看不到其他项目的公共成员。然后我在这个How to use a Class from one C# project with another C# project 教程中找到了解决方案。我应该通过右键单击在项目中添加参考。

解决步骤

1. 在“解决方案资源管理器”树中,展开 'CallOtherAssemblyVariablesOrMethods' 项目,然后右键单击 项目并从菜单中选择“添加引用”。

2. 在“添加引用”对话框中,选择“项目”选项卡并选择您的 'TutorialsPoint' 项目。

3. 如果您使用命名空间,则需要通过在“TutorialsPoint”中的文件中添加“使用”语句来导入“CallOtherAssemblyVariablesOrMethods”类型的命名空间 '。

非常感谢大家...

【讨论】:

    【解决方案2】:

    我猜你的 Program.cs 中有这样的内容:

    var typeFromOtherAssembly = new InternalEncapsulation();
    
    // Here you expect a compiler error:
    var area = typeFromOtherAssembly.GetArea();
    
    // This should return a string.
    var details = typeFromOtherAssembly.Display();
    

    您认为newDisplay() 可以工作,并且(内部)GetArea() 调用会显示编译器错误:

    “InternalEncapsulation”不包含“GetArea”的定义,并且找不到接受“InternalEncapsulation”类型的第一个参数的扩展方法“GetArea”(您是否缺少 using 指令或程序集引用?)

    但是您没有为InternalEncapsulation 类指定访问修饰符,所以它是internal

    如果没有指定访问修饰符,则默认为内部。

    所以在new InternalEncapsulation 你会得到另一个编译器错误:

    InternalEncapsulation 由于其保护级别而无法访问

    所以你需要把它公开:

    public class InternalEncapsulation
    

    【讨论】:

    • 程序集是 .NET 的“部署单元”,几乎总是一个 .exe 或 .dll。在 C# 术语中,它基本上是一个 C# 项目。来源:social.msdn.microsoft.com/Forums/en-US/…
    • @fsacer 我不确定这应该是对我的回答的评论。 OP 的问题不是“什么是程序集”。
    • 他问这些项目是否是不同的程序集,所以我想这可以回答。
    • @CodeCaster,你能从 Program.cs 访问 PublicEncapsulation.cs 的成员吗?我将分享我的 PublicEncapsulation.cs。
    • @MertÖzoğul 请注意,您的“PublicEncapsualtion”是问题中显示的内部类...我强烈建议将其重命名以匹配默认访问修饰符或明确指定非默认修饰符(相同如其他课程的此答案中所述)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多