我开始遇到有关调试程序的小问题。它会开始显示没有错误,然后我会按调试来测试它。它会给我一个错误的说法 “无法复制文件”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,因为找不到它。但是,发布模式似乎几乎总是有效。
答案 0 :(得分:0)
bin和obj文件夹仅用于输出。当您告诉Visual Studio执行清理或重建时,它将删除这些文件夹中的所有文件。您可以随时安全地删除这些文件夹,并且不应该在此过程中丢失任何内容。
您永远不会在这些文件夹中放置任何文件。如果要将外部程序集(EXE或DLL)添加到项目中,则应使用项目上的Add-> Existing Item命令将其添加到项目中。然后,您可以告诉您的项目引用该文件,它将使用本地相对路径。
例如,如果在项目根目录中创建“lib”文件夹并在其中放置some.dll
,则可以添加对项目中文件的引用,它将使用相对路径{{ 1}}。
答案 1 :(得分:0)
问题出在您当前项目中已设置为
的文件中复制到输出目录=始终复制/如果更新则复制
以这种方式添加文件时,VS将删除其他项目转储到当前项目bin /中的所有其他先前文件。
为避免这种情况,请添加文件并保留 Copy to output directory = Do not copy 选项,然后使用 MSBuild Copy任务来转储文件。
如果您使用的是docker,则可以简单地输入COPY命令-同一件事,但不能使用MSBuild。
我相信这是某些此MSBuild内部任务的默认行为,唯一的解决方法是
。