Visual Studio删除需要调试的文件

4

我遇到了一个小问题,与我的程序调试有关。它一开始没有显示任何错误,然后我按下调试按钮进行测试。它会抛出一个错误,说“无法复制文件“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无法复制,因为找不到它。但是,发布模式似乎几乎总是有效的。


"直到今天早上没有进行任何更改。" - 你是否通过查看项目级别的历史记录在源代码控制中验证了这个声明? - P.Brian.Mackey
1
你是否添加了对 obj 或 bin 文件夹中的文件的引用? - Trevor Elliott
我没有添加任何引用。而且,由于只有我一个人在工作,我确定没有进行任何更改。昨晚我使用它时,调试运行得很好。然后今天早上,我再次运行它,没有更改任何内容,只是想看看接下来该做什么,结果就出现了那个错误。 - GodsBane
不好意思,你误解了。当我说我删除了所有引用时,我的意思是我删除了对该类的所有调用,并将该类从项目中排除。 - GodsBane
这些都在一个项目中吗?还是你有一个包含引起问题的类的库,然后尝试构建引用该库的项目?我曾经遇到过 Visual Studio 无法复制所需引用的引用库的问题。我不得不直接在我正在尝试构建的项目中创建缺失的引用。 - ramsey_tm
显示剩余4条评论
2个回答

0

问题出在你当前项目中设置为

复制到输出目录=始终复制/仅在较新时复制

当你以这种方式添加文件时,VS会删除其他项目转储到当前项目bin/的所有先前文件。

为了避免这种情况,请将文件添加并将它们保留为不要复制选项,然后使用MSBuild复制任务来转储您的文件。

如果您正在使用docker,则可以简单地放置一个COPY命令-与MSBuild不同但是相同的事情。

我相信这是一些MSBuild内部任务的默认行为,解决方法是唯一的选择。


0

bin和obj文件夹仅用于输出。当您告诉Visual Studio进行清理或重建时,它将删除这些文件夹中的所有文件。您可以随时安全地删除这些文件夹,并且在此过程中不应该丢失任何内容。

您永远不应该将任何文件放入这些文件夹中。如果您想要向项目添加外部程序集(EXE或DLL),则应使用“添加->现有项”命令将其添加到项目中。然后,您可以告诉您的项目引用该文件,它将使用本地相对路径。

例如,如果您在项目根目录中创建一个“lib”文件夹并在其中放置some.dll,然后您可以向项目添加对该文件的引用,它将使用相对路径..\lib\some.dll


我已经尝试过清理,这实际上是我尝试的第一件事,但没有成功。我只是删除了 bin 和 obj 文件夹,但它仍然抛出相同的错误。 - GodsBane
在你的项目文件夹结构中,你所引用的包含INI文件函数的程序集(DLL或EXE)位于哪里? - Trevor Elliott
这只是一个类文件,位于我的项目的默认命名空间中。 - GodsBane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接