代码之家  ›  专栏  ›  技术社区  ›  Pradeep Puranik

如何在多个程序集上跨越C#命名空间?

  •  1
  • Pradeep Puranik  · 技术社区  · 8 年前

    一行字的问题没有意义,所以让我详细说明我的挑战:

    我已经创建了3个DLL( ),每个包含自己的一组“内部”类、类型和成员。所有类、类型和成员都是各自的默认命名空间(与其程序集名称相同)。

    1. MyAgent需要添加对MyConnector的引用,并使用它的一些类。MyConnector需要添加对MyUtils的引用,并使用它的一些类。 目前,MyAgent可能还需要访问MyUtils中的某些类型。

      现在,由于MyUtils中的所有类型和成员都是内部的,因此我无法将其添加为对MyConnector的引用,也无法将其从MyConnector添加到MyAgent。我不想公开这些类型中的任何一种,因为我不希望使用我的DLL的应用程序直接访问它们。

      我知道理论上可以跨越多个程序集的命名空间,但不清楚如何实际实现上述场景。

    2. 最后,我只想部署我的代理。要在EXE中使用的dll。该EXE应该只能访问MyAgent中的公共类型,但有一个例外:MyConnection对象(MyConnector中包含的类型)将从MyAgent方法返回。在这里,我的访问说明符(内部)再次限制了这种可能性。

    我想得太多了,现在完全搞糊涂了。非常感谢有经验的程序员的指导。

    提前谢谢。

    1 回复  |  直到 8 年前
        1
  •  5
  •   MakePeaceGreatAgain    8 年前

    跨越多个程序集的命名空间非常简单:

    程序集1中的file1.cs:

    namespace MyNamespace { ... }
    

    assembly2中的file2.cs:

    命名空间MyNamespace{…}
    

    然而,这根本帮不了你,因为 intenal 访问修饰符将使成员对同一个类中的任何类可见 装配 ,而不考虑其命名空间。因此,即使assembly1中有两个名称空间,也可以访问在中声明的所有内部成员 assembly1.MyNamespace ,但不包括 assembly2.MyNamespace .

    所以你 让他们 public 以便从其他程序集访问它们。或者,您也可以命名一个所谓的“朋友程序集”,它也可以从另一个程序集访问内部成员。为此,请添加一个 InternalsVisibleTo(fullNameForAssembly2) 到您的代码。