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

时间:2017-12-01 13:39:13

标签: c# dll namespaces exe

单线问题没有意义,所以让我详细说明我的挑战:

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

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

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

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

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

  3. 我一直在过度思考这一点,以至于我现在完全糊涂了。非常感谢有经验的程序员的一些指导。

    提前致谢。

1 个答案:

答案 0 :(得分:4)

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

程序集1中的file1.cs:

namespace MyNamespace { ... }

assembly2中的file2.cs:

namespace MyNamespace { ... }

然而,这根本无法帮助您,因为intenal access-modifier将使您的成员对同一程序集中的任何类都可见,无论其名称空间如何。因此,即使在assembly1中有两个名称空间,您也可以访问assembly1.MyNamespace中声明的所有内部成员,但不能访问assembly2.MyNamespace中的所有内部成员。

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