“在我的机器上可以运行”症状自查(Windows编程)
文章摘译自:Windows programming: The “it works on my machine” syndroma
- %ProgramFiles% folder protection
- UAC protection (User Account Control)
- File
- Path
- Windows 64bits
- Windows Compatibility Application Manifest
- Font
- Environment Variable
- DPI
- Blocked DLL and EXE
“Program Files” 目录保护
从 Vista 之后的 Windows 操作系统,应用程序的配置文件无法存放在之前的“%ProgramFiles%/[程序名称]” 目录下面,转而放在“%AppData%”目录下。
帐户控制保护
当程序启动一个进程或者访问网络的时候,Windows 帐户控制(UAC)可能会暂时“冻结”程序。
文件
注意只读文件、文件未找到、文件受保护或者是文件被阻止。
不要试图采用异常处理机制来解决这一类问题,而是使用类库来预防以及追加。
Exception Handling Best Practice in .NET
路径
考虑到相对路径、文件和目录转换、超过256字符的目录、文件名和扩展名,路径不仅仅是一个简单的字符串。
A free library to handle common and complex path operations
64位 Windows 操作系统
如果你使用了 unsafe code(比如指针pointer),那么你只有两种选择:
- 仅编译为 X86 模式 —— Wow64(Windows on Windows 64),你的程序很有可能会在64位的机器上以32位模式运行。
- 编译为 X86 和 X64 模式 —— 你会得到两个不同的分发包。64位模式的程序很有可能在64位的操作系统上得到更好的支持。
Windows 操作系统兼容应用程序列表
Windows Vista 和 Windows 7 有特别的兼容模式,用来执行早期版本的 Windows 程序。你可以在程序的属性页中兼容选项卡中选择你的兼容模式,执行程序的兼容模式存储在注册表里面。
字体
不要依赖于任何指定的字体列表,除非你能够检查字体列表的可用性并且处理其异常。
常见的问题是开发机器上安装有随 Office 附带的字体,而那些“干净”(没有安装 Office )的 Windows 上可能并没有你需要的字体。
推荐使用 Arial Narrow 和 MS sans serif
环境变量
即使是最基本的环境变量也可能没有按照默认值来设置。
DPI
一般情况下,程序在 96 DPI(Dot Per Inch)下运行良好,但是也有一些笔记本用户偏爱 120 DPI,这可可能导致 Window Form 和 GDI+ 部分的代码显示不正常。
DLL 和 EXE 被禁用
在 Windows 7 操作系统上,如果你使用 IE 下载一个 zip 文件,并且使用 Windows zip 解压缩,那么,解压后的 dll 和 exe 文件可能被操作系统标记为“阻止”。在这种情况下,一般会有提示框要求你确认这些可执行文件是否安全。但是如果是 Visual Studio 插件 DLL,那么 Visual Studio 2010 将无法加载这些插件,并且报错。