我开始遇到一个关于调试程序的小问题。它会开始显示没有错误,然后我会按调试来测试它。它会给我一个错误,说“无法复制文件“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”,它仍然不起作用,尽管注释掉了这 3 行,项目完全构建。
编辑 我设法在一定程度上解决了这个问题。我只需要在发布版本中运行我的程序。如果我在调试模式下运行它,我总是会收到错误说无法复制 exe,因为它没有找到。但是,Release 模式似乎几乎总是有效。