写点什么

使用 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:553674
用户头像

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

关注

评论

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

架构实战营-模块八作业

老实人Honey

python学习笔记:day1——python入门了解

秦时明月

Python编程

中秋晴朗夜,我们与星月相见

脑极体

架构实战营-模块八作业

以吻封笺

21. AI会让人类大量失业吗

Databri_AI

人工智能

[架构实战营]模块八作业

xyu

#架构实战营

你是一名技术管理者还是项目管理者?

菜根老谭

项目管理 技术管理

架构实战营 模块八 作业

脉醉

#架构实战营

架构实战营模块8作业

zlz

数据仓库的数据从哪来?

奔向架构师

数据仓库 9月日更

架构训练营 模块七

小卷儿

【架构设计模块八】:设计消息队列存储消息数据的 MySQL 表格

Ryoma

Ember.js 项目开发之 Ember Data

devpoint

ember.js 9月日更

作业8

柱林

模块八作业

VE

架构实战营

JavaScript进阶(六)继承

Augus

JavaScript 9月日更

zookeeper迁移实践

小江

zookeeper 迁移数据

机场做好这道题,才能万户千家共婵娟

脑极体

linux之dd命令

入门小站

Linux

Prometheus PushGateway 0.9 和 1.0 的区别

耳东@Erdong

Prometheus PushGateway 9月日更

消息队列:RocketMQ事务实现

正向成长

RocketMQ事务

架构实战营1期模块八作业——中间件设计

tt

架构实战营

【LeetCode】最后一个单词的长度Java题解

Albert

算法 LeetCode 9月日更

手机测试岗位常见面试问题汇总(持续更新中)

IT蜗壳-Tango

9月日更

网络攻防学习笔记 Day143

穿过生命散发芬芳

9月日更 虚拟化技术

在线SQL(Insert/Update)语句转JSON工具

入门小站

工具

python 学习笔记:day2——基本数据类型

秦时明月

Python编程

消息队列数据存储设计案例-模块八

小牧ah

架构实战营

模块8作业

Geek_ywh40v

模块八作业

河马先生

架构实战营

模块八作业

king

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