写点什么

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

  • 2010-08-10
  • 本文字数:851 字

    阅读完需:约 3 分钟

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

2010-08-10 08:553816
用户头像

发布了 88 篇内容, 共 273.5 次阅读, 收获喜欢 9 次。

关注

评论

发布
暂无评论
发现更多内容

前缀和算法

工程师日月

算法 5月月更

Druid连接池源码阅读04

石小天

FLV封装格式

Loken

音视频 5月月更

为什么花大本钱培训后,研发团队的表现还是很差?

高山

培训 CMMI 培训效果

如何备份 WordPress 数据库

海拥(haiyong.site)

WordPress 5月月更

看 AWS 如何通过 Nitro System 构建竞争优势

云物互联

云计算 AWS DPU 硬件虚拟化技术

设计模式之原型模式

乌龟哥哥

5月月更

一份让面试官满意的简历究竟要做到什么

宇宙之一粟

简历模板 简历 5月月更

在Flutter中使用WillPopScope

坚果

5月月更

CRMEB 知识付费模版消息修改教程

CRMEB

从相亲来看Flutter 的 StatefulWidget 和 StatelessWidget

岛上码农

flutter ios开发 安卓开发 跨平台应用 5月月更

【刷题第八天】11. 盛最多水的容器

白日梦

5月月更

网站开发进阶(六十三)详解CSS3中的calc()

No Silver Bullet

css3 5月月更 calc()

使用声网 SDK 为Android APP添加视频直播

RTE开发者社区

android 教程 视频直播

【C 语言】指针 Two 之[定义指针变量、有效声明指针、使用指针、指针变量初始化]

謓泽

5月月更

Redis「2」缓存一致性与异常处理

Samson

Redis 核心技术与实战 学习成长 5月月更

覆盖 70% 核心业务,ShardingSphere 如何成为喜马拉雅架构演进的催化剂

SphereEx

Apache 数据库 开源 ShardingSphere SphereEx

CDH5部署三部曲之二:部署和设置

爱好编程进阶

Java 程序员 后端开发

druid源码学习四-多线程之锁探究

Nick

Apache Druid 锁机制 多线程安全

[数据分析实践]-音频分析-BirdCLE-2

浩波的笔记

人工智能 机器学习 数据分析

使用 Amazon Cloud WAN 构建您的全球网络

云物互联

云计算 AWS Cloud WAN

Cocos Creator学习の有限状态机

空城机

Cocos 5月月更

druid 源码阅读 4——走一个单测看sql运行

张大彪

2021-12-15【Codeforces Round #760 (Div

爱好编程进阶

Java 程序员 后端开发

【愚公系列】2022年05月 二十三种设计模式(十三)-职责链模式(Chain of Responsibility Pattern)

愚公搬代码

5月月更

反向代理 413 Request Entity Too Large 问题

HoneyMoose

Docker下的OpenResty三部曲之三:OpenResty加Tomcat的服务

程序员欣宸

Kubernetes openresty 5月月更

学生管理系统(2)

5月月更

【LeetCode】一次编辑Java题解

Albert

LeetCode 5月月更

数据库连接池 -Druid 源码学习(四)

wjchenge

Druid 数据库连接池

Collections和Objects的使用注意

zarmnosaj

5月月更

使用ILMerge的内化特性时要小心了_.NET_Abel Avram_InfoQ精选文章