具有相同命名空间但在不同程序集中的内部类?

Posted

技术标签:

【中文标题】具有相同命名空间但在不同程序集中的内部类?【英文标题】:Internal classes having the same namespaces but in different assemblies? 【发布时间】:2016-01-14 01:28:49 【问题描述】:

基本上我有一个定义内部类的 CS 文件,然后我复制到各种 CS 项目。这些 CS 项目的程序集将被加载到应用程序中。该程序似乎运行良好。

但是,在同一个命名空间中有多个具有相同类名的类让我感到不安,即使它们在每个程序集中都是内部的。

一个类是否通过类名、命名空间以及 AppDomain 中的程序集来唯一标识?

【问题讨论】:

为什么在不同的程序集中使用相同的命名空间?这听起来像是在自找麻烦。 @NickBailey 在不同的程序集中使用相同的命名空间名称并不是那么糟糕,就像在 System.dllSystem.Core.dll 中的 System.Collections.Generic 【参考方案1】:

一个类是否通过类名、命名空间以及 AppDomain 中的程序集来唯一标识?

简短回答:是的。

更长的答案:

有一些微妙的问题需要考虑。

首先,从 CLR 的角度来看,没有“命名空间”之类的东西。就 CLR 而言,字符串类型的名称是 System.String。所以更准确的说法是,从 CLR 的角度来看,一个类型由其名称和程序集唯一标识。

其次,类型可以嵌套。所以类型实际上是由它们的名称唯一标识的,包含类型(如果有的话)和程序集。

第三,类型可能是通用的。 Foo.BarFoo.Bar<T> 是不同的类型。因此类型由它们的名称标识,包含类型、程序集和泛型。

第四,这很奇怪,CLR 认为加载有Load 的程序集中的类型与加载有LoadFrom 的同一程序集中的类型不同。您最终可能会遇到 CLR 告诉您汇编 Bar 中的 Foo 类型与汇编 Bar 中的 Foo 类型不兼容的情况,这令人困惑。

【讨论】:

【参考方案2】:

虽然它使事情变得混乱,但您的所有内部类只存在于它们各自的程序集中,因此它们是自治的,不会被其他程序集中的其他类看到。

但从维护和简单性的角度来看,它应该放在家务管理任务的首位。

【讨论】:

是的,这是一个 hack。我的问题更多是关于计算科学而不是软件工程。那么CLR不会在所有情况下都抱怨吗?【参考方案3】:

是的,CLR 使用程序集来识别每种类型。如果你编译一个简单的 Hello World 应用程序并查看 IL:

.method private hidebysig static void  Main(string[] args) cil managed

  .entrypoint
  // Code size       13 (0xd)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldstr      "Hello world"
  IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_000b:  nop
  IL_000c:  ret
 // end of method Program::Main

您可以通过包含程序集、命名空间和类名来了解如何引用 System.Console。但是,如果您指的是同一程序集中的类型,则可以隐含程序集名称,例如:

.method private hidebysig static void  Main(string[] args) cil managed

  .entrypoint
  // Code size       13 (0xd)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldstr      "Hello world"
  IL_0006:  call       void ConsoleApplication1.Foo::Write(string)
  IL_000b:  nop
  IL_000c:  ret
 // end of method Program::Main

【讨论】:

以上是关于具有相同命名空间但在不同程序集中的内部类?的主要内容,如果未能解决你的问题,请参考以下文章

EF4 Poco 问题映射类型相同的名称相同的程序集不同的命名空间

System.Security.Cryptography.HMACSHA1 存在于具有相同命名空间的两个程序集中

是否可以在 spl_autoload_registry 中扩展具有相同类但路径不同的命名空间类

使用具有相同 ClassName 的其他命名空间扩展类

命名空间和程序集

XSLT 在与根元素具有相同命名空间声明的内部标记中缺少命名空间