【问题标题】:How to span C# namespaces over multiple assemblies?如何跨越多个程序集的 C# 命名空间?
【发布时间】:2018-05-15 15:12:49
【问题描述】:

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

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

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

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

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

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

我一直在想太多,以至于我现在完全糊涂了。非常感谢有经验的程序员的一些指导。

提前致谢。

【问题讨论】:

  • 这不是您问题的解决方案,但我质疑没有公共类型的实用程序程序集的价值。您能否详细说明为什么您希望实用程序类型保留在内部?
  • 也许我不是很清楚。最后一个 dll (MyAgent) 也有公共类型,这些是 exe 会调用的类型。但我需要隐藏包含支持实现的所有其他程序集的实现细节。将这些公开不仅会给智能列表添加不必要的噪音,而且还会鼓励和鼓励 exe 开发人员玩弄他们不应该玩的东西。
  • 无论如何,我想我已经找到了一种方法来实现我想要的,只是在应该公开多少方面做出了一些妥协。所以我正在考虑解决这个问题,并会问一个我遇到任何新障碍的新问题。感谢您的宝贵时间。

标签: c# dll namespaces exe


【解决方案1】:

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

程序集 1 中的文件 1.cs:

namespace MyNamespace { ... }

assembly2 中的file2.cs:

namespace MyNamespace { ... }

但是,这对您毫无帮助,因为intenal 访问修饰符将使您的成员对同一程序集 中的任何类可见,而不管它们的命名空间如何。因此,即使您在 assembly1 中有两个命名空间,您也可以访问在 assembly1.MyNamespace 中声明的所有内部成员,但不能访问在 assembly2.MyNamespace 中声明的那些。

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

【讨论】:

  • 哦,是的,内部是汇编范围!有没有办法将范围限制为命名空间?我不希望用户在我的类上使用我的 dll 调用方法,他们不应该这样做。编辑:将检查您提到的替代方案。谢谢。
  • 见我的最后一段。 internalsvisibleto-attribute 就是你要找的。​​span>
  • 我想我应该让您知道:虽然我没有使用该属性,但我确实从您发布的链接中学到了一些新东西,并且它可能会派上用场,非常感谢您。与此同时,我让它变得更简单,几乎实现了我想要的,在应该公开多少方面做出了一些妥协。所以我正在考虑解决这个问题,并会问一个新的我遇到任何新的障碍。感谢您的宝贵时间。
猜你喜欢
  • 2014-09-14
  • 2012-04-28
  • 2011-04-01
  • 2023-03-25
  • 1970-01-01
  • 2011-02-12
  • 2021-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多