我遇到了一个小问题,与我的程序调试有关。它一开始没有显示任何错误,然后我按下调试按钮进行测试。它会抛出一个错误,说“无法复制文件“obj\x86\Debug[programName].exe”,因为找不到该文件。” 我已经尝试过各种方法,并得出结论,这是一个类的问题,我正在使用该类来通过导入dll读取ini文件。那个类中最可能的两行代码是这些:
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
为了测试这个问题,我将该类从项目中删除并删除所有引用。然后,项目成功构建完成。接下来,我可以查看路径并找到之前缺失的可执行文件。认为问题得到解决后,我将该类放回去,但是与预期一样,出现了相同的错误。它实际上在构建之前删除了可执行文件,所以我认为很明显为什么找不到。
然而,不那么明显的部分是:直到今天早上没有对其进行任何更改,该程序一直使用此类进行构建和执行。此外,在我的Unity3D游戏中,这个类完美地工作,并且可以读取c#程序所创建的ini文件。
有人能告诉我为什么会出现这种情况,以及是否有解决方法?我已经尝试创建一个新项目并重新导入所有内容,但它产生了相同的错误。
编辑:
在评论并取消注释每一行后,我发现这个问题是由这个类中的三个被注释的行引起的。
public bool SaveToIni()
{
IniFile file = new IniFile("/LoadUpSettings.ini");
try
{
file.IniWriteValue("Screen", "Screen Height", cbbScreenHeight.SelectedItem.ToString());
file.IniWriteValue("Screen", "Screen Width", cbbScreenWidth.SelectedItem.ToString());
//file.IniWriteValue("Controllers", "Razer Hydra", ckbRazerHydra.Checked.ToString());
//file.IniWriteValue("Controllers", "Oculus Rift", ckbOculusRift.Checked.ToString());
//file.IniWriteValue("Screen", "Fullscreen", ckbFullscreen.Checked.ToString());
return true;
}
catch
{
MessageBox.Show("Please fill out all values");
return false;
}
}
这是IniFile类中的IniWriteValue函数。
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
public string IniReadValue(string Section, string Key)
{
StringBuilder temp = new StringBuilder(255);
int i = GetPrivateProfileString(Section, Key, "", temp, 255, this.path);
return temp.ToString();
}
奇怪的是,如果我删除ckbRazerHydra.Checked.ToString(),并放入标准字符串(如“True”),它仍然无法正常工作,尽管将这三行注释掉后,项目可以完全生成。
编辑 我设法在某种程度上解决了这个问题。我只需要以发布版本运行程序即可。如果我以调试模式运行它,我将始终得到错误,说exe无法复制,因为找不到它。但是,发布模式似乎几乎总是有效的。