Ironpython 生成 exe 文件的时候加入 ico 资源

分发 windows 下的 python 程序的时候,免不了要生成 .EXE 文件提供给最终用户。在 Ironpython 里,微软的例子里是有一个 pyc.py,利用 .Net Runtime 提供的 API 将脚本转成 DLL/EXE;Ironpython 2.6 发行的时候,干脆直接把这个 pyc.py 放进了安装包。

但是我在使用 pyc.py 的时候,觉得很不爽的一点就是不能像 py2exe 那样,指定一个 ico 文件作为 .EXE 在桌面环境下的显示图标。俺觉得 .Net 怎么也应该对 win32 desktop 有点特别的支持啊,于是就是好好研究了一下是否简单修改修改 pyc.py 就能搞定这事。

最后找到如下信息:
  1. .Net 下生成可执行文件有两种方法:Reflection.Emit vs. CodeDOM
  2. pyc.py 是 Reflection.Emit 方案
  3. c# 编译器提供了一个 win32icon 选项
  4. 顺藤摸瓜,在 .Net 环境里的 CompilerParameters 类的 CompilerOptions 可以指定 win32icon
  5. 然而这个 CompilerParameters 是 CodeDom 这个思路里的,所以简单修改 pyc.py 是不可行的
  6. 纠结的是 Ironpython 1.1 尚有 IronPython.CodeDom.PythonProvider,但 2.0 开始就消失了

结论就是,用2.0/2.6的话就别想一次性编译搞定了,用 1.1 的话也许能实现目标——不过近期内实在是没有闲心去弄这个了

话说 codedom 可以搞出一些很牛逼的应用,比如把 c# 代码转换成 ironpython 代码。当初 SharpDevelop 刚刚集成 Ironpython 1.1 开发的时候就搞了几个相关特性,后来集成 IP 2.0 的时候被迫去掉了。现在 SharpDevelop 换了个思路,利用抽象语法树又重新一一实现

Topic: 技术