当在用户控件中使用当前路径时,如果使用下列方法,可能会导致设计器不能正常工作:
Environment.CurrentDirectory
Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)
Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)
Application.StartupPath
这些方法在运行时没问题,但是在设计器加载时,就不对了,因为这些代码是在Visual Studio的进程(devenv.exe)中运行的(有点像代码注入,有心人可以利用这一点,对Visual Studio进行一些注入之类的),所以得到的是Visual Studio所在的目录。
当然,你可以在设计时用绝对路径,最终生成时再改回去,但这毕竟不是一个好方法。
后来我想到了获取当前代码所在模块的路径,结果发现其路径是X:/Users/UserName/AppData...,原来是编译器临时产生了一个文件,其路径跟工程无关,本来都想放弃了,打算用xxx.vshost.exe的路径来代替(前提是同一工程不能打开多次),结果想到了下面的方法:
Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase.Replace("file:///", "").Replace("/obj/", "/bin/"));