BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

使用ILMerge的内化特性时要小心了

| 作者 Abel Avram 关注 7 他的粉丝 ,译者 张龙 关注 12 他的粉丝 发布于 2010年8月11日. 估计阅读时间: 3 分钟 | GMTC大前端的下一站,PWA、Web框架、Node等最新最热的大前端话题邀你一起共同探讨。

ILMerge是个.NET实用工具,可以将多个程序集合并为一个并将类型的可见性由public改为internal。这么做的结果既有积极的一面,也有消极的一面,取决于用户如何使用生成的结果集。

如果开发者创建好了框架或应用,想将其与所有依赖的框架或库绑定起来以向用户隐藏这些内容,同时使得最终的框架易于安装与使用,那么ILMerge就是个不错的选择。可以通过命令提示符或编程的方式使用ILMerge。其中一个可设定的属性是Internalize,它用于隐藏类型信息,这是通过将这些类型变为internal实现的。

微软解决方案架构MVP与NServiceBus之父Udi Dahan曾使用过ILMerge将NServiceBus 1.9版的所有依赖绑定到一个结果集中,但他没有隐藏任何类型信息,这导致了如下后果:

在开发者使用NServiceBus时,所有第三方的类型都公开出来了。对于那些碰巧使用同样版本程序库的开发者来说,这没什么问题,但遗憾的是,使用Castle等程序库的开发者们非常挑剔所用的版本——这导致了版本冲突,也就是众所周知的“版本地狱”问题。

在NServiceBus 2.0中,Dahan开始使用Internalize特性,但他认为并非所有类型信息都应该隐藏起来:

比如说,NServiceBus在内部使用了NHibernate来持久化长期运行的进程(叫做sagas),我们希望这种实现细节不要与开发者在NServiceBus上所进行的工作发生冲突。要想让NHibernate正常工作,它需要向配置环境,尤其是NHibernate.Cfg.MappingSchema命名空间中的所有类型公开某些类型信息。

某些用户想要访问绑定程序库的API,但如果他们都是internal,那就没法访问了。因此,最好不要改变某些类型的信息。一种可能的解决方案就像NServiceBus所做的那样,发布两个版本:一个面向一般用户,他们仅仅使用框架而已;另一个包含了核心二进制文件,面向那些想要完全控制框架的用户。

ILMerge需要使用.NET Framework 2.0+,它可以合并所有的.NET程序集,包括使用.NET 1.0/1.1生成的程序集。该工具只能用在Windows上,并不支持Rotor和Mono。

查看英文原文:Using ILMerge Internalization with Caution

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT