今天在debug一个奇怪的问题,一个程序在开发机器上没有任何错误,但是安装在客户机器上之后,只要客户运行它,就立刻停止响应。更加奇怪的是,程序本身没有输出任何日志。开始以为是安装包做的不好,但是几次实验之后,证明问题出在程序本身。经过排除法,发现这个问题只在启用了UAC的Windows 7和Vista上。于是我包了一个很大的Try Catch,并且用MessageBox直接输出Exception的内容。结果是令人惊讶的,问题居然就出在写Log的地方。
网上搜索了一下,便很快找到了原因。当User Access Control被启用之后,程序不能改写%ProgramFiles%目录中的内容。而我调试的程序一开始就在写Log,同时Log的目录又就是在安装目录底下。说白了,这其实是一个很不好的编程习惯所导致的问题,作为一个正规的程序,它的临时文件应该保存在%APPDATA%中。修改了Log保存路径之后,一切OK。
附C#中获得%APPDATA%的代码:
string appDataFolder = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);