机器: XP SP2 简体中文, VS2003, VS2008. .NET Framework 1.1, 2.0, 1.1 SP1, 2.0 SP1, 3.0, 3.0 SP1, 3.5 各个版本都有.
忘了在做时候的时候, 向我的环境变量中添加了一个变量:
COMPlus_Version 值是 v1.1.4322
是.NET 1.1 的正式发布版本号. 也是
C:\Windows\Microsoft.NET\Frameword\v1.1.4322 的目录名.
这个环境变量, 带给我最近一个星期以来无数的麻烦, 一言以蔽之, 这个环境变量影响了 mscoree.dll 这个CLR的loader 在判断一个.NET的可执行程序到底应该由哪个版本的CLR来运行, 以上面的变量来说, 即使你的Assembly中明确记着运行该程序需要的最低CLR版本是2.0(这是metadata的一部分), mscoree.dll也会找到1.1版的CLR来运行, 无论程序中本身有多简单, 所用的IL指令是否完全兼容于1.1, 1.1的CLR无论如何也不能载入2.0的程序来运行, 上面的一个DOS窗口演示了设置这个环境变量与清除它的情况下一个最简单程序的行为, 抛出异常时, 还有下面的UI窗口自上而下依次弹出:
如果可执行程序通过 app.exe.config 来强制指定要运行的CLR版本, 如下内容:
程序可以被正确执行, 说"被"正确执行是因为决定载入哪个版本的CLR并不由它本身单独决定. 但是, 强制要求每个编译出来的程序都以这种方式指定是非常不方便的.
更何况, 这个环境变量还会引起VS2008在编译程序时去找1.1 版本的manifest来嵌入, 结果当然是找不到或有错误, 简单的项目编译都通不过, 一开始当然怀疑是其它方面的问题, 试了很久发现以其它用户的身份来运行VS2008就没有这个问题, 因为这个事实又开始怀疑是用户权限, 安全性等方面的问题, 其实只是其它用户没有这个环境变量而已, 用其它用户的身份来执行VS2008会在项目编译失败时频繁出现下面的错误, 这个错误窗口一弹出, VS2008就死了, 必需重启VS2008.
用"Can't create head map1."来搜索, 得到的结果不多, 到现在我也不知道真正原因所在.
比如使用 SnippetCompiler这样的程序, 因为上述原因, 首先这个程序本身启动不了, 这个问题可以通过上面说的app.exe.config来解决. 但是, 这个工具的工作原理是在临时目录创建可执行程序, 然后直接运行, 使用这样的工具就是因为它可以快速验证某个.NET 的API是否如你期望的工作, 不需要手工运行命令行或者在VS中单独成立一个项目, 要求找到临时目录添加相应的app.exe.config会让人根本就放弃使用这样的工具.
受这个问题折磨期间, 我用ghost备份了原来的系统, 花了一整天的时间到处搜索, 试一种方案不行, 再把备份的ghost刻回到硬盘上. 痛苦不堪, 没想到, 一个小小的环境变量能有这么大的破坏力. 让我找到这个祸因的还是上面的"Can't create Head Map1."窗口, 因为出现的太频繁, 让我以其它用户运行VS2008也变得不可行, 开始怀疑是不是PATH环境变量里面的路径顺序不对, 打开环境变量列表, 因为COMPlus_Version中字母C排行靠前的原因, 一眼就看到了这个, 疑心顿起, 一试之下, 竟然真是它.
阅读(1581) | 评论(2) | 转发(0) |