最近我发现了一些允许将 .Net 库合并到 Windows 应用程序中的工具。
现在真正的问题是图书馆的行为如何改变,
- 内部类是否仍然在库内部?或者它是否成为它所合并的应用程序的内部?
- 图书馆有可能发生故障吗?
扩展问题:
- 合并内部程序集时应该将其设置为私有,这样合并后的应用程序不能使用它,这不是更好吗?
最近我发现了一些允许将 .Net 库合并到 Windows 应用程序中的工具。
现在真正的问题是图书馆的行为如何改变,
扩展问题:
类不能是私有的,除非它们是嵌套的。
但是请考虑一下:如果您要合并程序集 A 和 B,那么您必须在合并之前已经编译它们。当它们被编译时,它们的内部方法彼此无法访问。因此,在合并后的代码中,不可能有调用其他程序集内部方法的方法。
在合并内部程序集时应该将其设为私有,以便它们合并的应用程序不能使用它会更好吗?
那将如何运作?如果顶级类型是私有的,那么其他类型根本无法访问它。 这就是为什么你不能定义私有类型(除非它们嵌套在另一种类型中)。
假设程序集 A 具有类 C 和 D,其中 C 是内部的,并且 D 从类 C 调用某些方法。当类 C 变为私有时(在可能的 CTS 的某些假设版本中),类 D 中断。
没有嵌套到其他类型中的顶级类型只能具有内部或公共可访问性。这些类型的默认可访问性是内部的。
从 MSDN链接
1 内部类是否仍然在库内部?或者应用程序的内部是否被合并?
它保留在应用程序内部。
2 图书馆是否有可能发生故障?
从技术上讲是可能的。假设 A 类是 App 内部的,也是 lib 之一(具有相同的命名空间)。在合并之前不会有任何问题。合并后将成为解决模糊引用的问题。
应用程序(SmartAssemply/ILMerger)如何处理这些是另一个问题(我不知道)?他们可以选择提供错误信息,也可以不提供。他们可能选择转换,也可能不转换。
在合并内部程序集时应该将其设为私有,以便它们合并的应用程序不能使用它会更好吗?
由于指定的顶级类型不能是私有/受保护的。
ILMerge 可以破坏库,尽管只有在库设计不良时才会发生这种情况。
破损将与 无关internal
。但是如果使用反射来测试从哪个程序集中加载某些东西,或者在特定程序集中搜索类型,结果会发生变化。
我会更担心合并对代码访问安全属性的影响,而不是对internal
. 但本质上,不要合并需要在不同信任级别运行的程序集。