4

プログラムのデバッグに関して小さな問題が発生し始めました。最初はエラーが表示されず、デバッグを押してテストしました。「ファイル "obj\x86\Debug[programName].exe" が見つからなかったため、コピーできませんでした」というエラーがスローされます。いろいろいじりを進めた結果、dllをインポートしてiniファイルを読み込むために使っているクラスであるという結論に達しました。そのクラスで最も可能性の高い 2 つの行は次のとおりです。

[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);

これをテストするために、プロジェクトからクラスとすべての参照を削除したところ、プロジェクトが正常にビルドされました。次に、パスを調べて、以前は欠落していた実行可能ファイルを見つけることができました。問題が解決したと思って、クラスを元に戻しましたが、ご想像のとおり、同じエラーで壊れました。ビルド前に実際に実行ファイルを削除したので、私の頭の中では、なぜ見つからなかったのかは明らかです。

ただし、それほど明白ではない部分は次のとおりです。プログラムは、変更が行われることなく、今朝までこのクラスでビルドおよび実行されていました。さらに、このクラスは、この c# プログラムが作成する ini ファイルを読み取る Unity3D ゲーム内で完全に機能します。

なぜこれが起こっているのか、そしてそれに対する修正があるかどうか誰か教えてもらえますか? 新しいプロジェクトを作成してすべてを再インポートしようとしましたが、同じエラーが発生します。

編集

各行にコメントを付けてコメントを外した後、この 3 つのコメント行が問題の原因であることがわかりました。

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 モードはほぼ常に機能しているようです。

4

2 に答える 2