【问题标题】:Visual Studio deleting files it needs to debugVisual Studio 删除需要调试的文件
【发布时间】:2025-12-30 13:15:10
【问题描述】:

我开始遇到一个关于调试程序的小问题。它会开始显示没有错误,然后我会按调试来测试它。它会给我一个错误说 “无法复制文件“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 模式似乎几乎总是有效。

【问题讨论】:

  • “直到今天早上,没有对其进行任何更改。” - 您是否通过查看项目级别历史记录在源代码控制中验证了此声明?
  • 您是否添加了对 obj 或 bin 文件夹中的文件的引用?
  • 我没有添加对任何内容的引用。而且,由于我是唯一一个为此工作的人,我很肯定没有任何变化。我昨晚使用它,调试运行良好。然后今天早上,我再次运行它,没有做任何更改,只是想看看接下来我必须做什么,它抛出了那个错误。
  • 您在问题中明确表示,您从项目中删除了所有引用,并且它再次开始工作。我假设您的引用之一是引用 obj 文件夹中的文件。不应该。忘记在它最后一次工作和它停止工作之间你可能做了什么。这可能是您几天或几周前所做的事情,直到您进行清理或重建后才出现问题。
  • 不不,你误会了,当我说我删除了所有引用时,我的意思是我删除了对该类的所有调用,并从项目中排除了该类。

标签: c# visual-studio-2010


【解决方案1】:

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

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

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

【讨论】:

  • 我试过做一个干净的,这实际上是我尝试的第一件事,没有成功。我刚刚删除了 bin 和 obj 文件夹,它抛出了同样的错误。
  • 在您的项目文件夹结构中,您引用的包含 INI 文件函数的程序集(DLL 或 EXE)在哪里?
  • 它只是一个类文件,位于我项目的默认命名空间中。
【解决方案2】:

问题在于您当前项目中已设置为的文件

复制到输出目录=始终复制/如果更新则复制

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

为了避免这种情况,请添加文件并使用 Copy to output directory=Do not copy 选项保留它们,然后使用 MSBuild Copy task 转储文件。

如果您使用的是 docker,您可以简单地输入一个 COPY 命令 - 相同的东西,但与 MSBuild 不同。

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

【讨论】: