4

最近我发现了一些允许将 .Net 库合并到 Windows 应用程序中的工具。

现在真正的问题是图书馆的行为如何改变,

  1. 内部类是否仍然在库内部?或者它是否成为它所合并的应用程序的内部?
  2. 图书馆有可能发生故障吗?

扩展问题:

  1. 合并内部程序集时应该将其设置为私有,这样合并后的应用程序不能使用它,这不是更好吗?
4

4 回答 4

6

类不能是私有的,除非它们是嵌套的。

但是请考虑一下:如果您要合并程序集 A 和 B,那么您必须在合并之前已经编译它们。当它们被编译时,它们的内部方法彼此无法访问。因此,在合并后的代码中,不可能有调用其他程序集内部方法的方法。

在合并内部程序集时应该将其设为私有,以便它们合并的应用程序不能使用它会更好吗?

那将如何运作?如果顶级类型是私有的,那么其他类型根本无法访问它。 这就是为什么你不能定义私有类型(除非它们嵌套在另一种类型中)。

假设程序集 A 具有类 C 和 D,其中 C 是内部的,并且 D 从类 C 调用某些方法。当类 C 变为私有时(在可能的 CTS 的某些假设版本中),类 D 中断。

于 2012-12-26T14:30:42.683 回答
2

没有嵌套到其他类型中的顶级类型只能具有内部或公共可访问性。这些类型的默认可访问性是内部的。

从 MSDN链接

1 内部类是否仍然在库内部?或者应用程序的内部是否被合并?

它保留在应用程序内部。

2 图书馆是否有可能发生故障?

从技术上讲是可能的。假设 A 类是 App 内部的,也是 lib 之一(具有相同的命名空间)。在合并之前不会有任何问题。合并后将成为解决模糊引用的问题。

应用程序(SmartAssemply/ILMerger)如何处理这些是另一个问题(我不知道)?他们可以选择提供错误信息,也可以不提供。他们可能选择转换,也可能不转换。

在合并内部程序集时应该将其设为私有,以便它们合并的应用程序不能使用它会更好吗?

由于指定的顶级类型不能是私有/受保护的。

于 2012-12-26T14:50:49.447 回答
0

MSDN对此非常清楚:

内部类型或成员只能在同一程序集中的文件中访问...

由于您将它们合并到一个程序集中,因此合并程序集中的所有文件都可以访问内部类。

于 2012-12-26T14:31:48.083 回答
0

ILMerge 可以破坏库,尽管只有在库设计不良时才会发生这种情况。

破损将与 无关internal。但是如果使用反射来测试从哪个程序集中加载某些东西,或者在特定程序集中搜索类型,结果会发生变化。

我会更担心合并对代码访问安全属性的影响,而不是对internal. 但本质上,不要合并需要在不同信任级别运行的程序集。

于 2012-12-26T15:03:15.917 回答