私には奇妙に思える状況があります。私は C# で WCF Web サービスを持っており、ファイルを開き、現在の変数の値についていくつかの行を書き込んでファイルを閉じます。これは、顧客の場所で何かをデバッグするために使用する必要があるかどうかに応じて、オフまたはオンにする機能です。
すべての読み取りおよび書き込み機能について、バックグラウンドで COBOL コードを実行する DLL とやり取りして、レガシー データ ストレージ システムにアクセスします。すべての変数は参照によって渡され、返されるデータは同じ参照変数を通じて返されます。ほとんどの場合、変数は正しいサイズに初期化されて渡され、データが返されます。関数の戻り値の型は、COBOL 環境での実行のすべてのステータスであり、プログラムが正常にロード/初期化されていないかどうか、実行が正常であったかどうかなどを示します。すべての書き込みは 0 の成功と -1 の失敗を返します。
この DLL へのすべての呼び出しの前後にデバッグ コードがあるので、前後の値を確認できます。デバッグ関数は、FileStream に書き込み行を実行して戻ります。ワーカー関数に参照として渡すのと同じ変数を、値によってデバッグ関数に渡します。
デバッグ スイッチをオンにすると、奇妙なことが起こり始めます。1 ~ 2 回呼び出した後、ワーカー関数の成功/失敗コードの値は 0 のままです。もちろん、私のロジックは 0 がデータ ファイルへの書き込みの成功であると信じているため、書き込みが正常に機能したと誤って報告しています。dll をデバッグすると、具体的には -1 が返され、書き込みが失敗したことを Web サービスに通知しようとしていることがわかります。値が Visual Studio ウォッチに表示されると、何らかの理由で 0 になり、成功を示します。
私が頭を悩ませているのは、デバッグスイッチをオフにした場合です。これにより、FileStream ライターがオフになり、値による変数の受け渡しがオフになり、ワーカー関数への参照によって渡されます。すべてが正常に機能します。Dll からの値は、成功/失敗の場合に正しく表示されます。戻り値が壊れる理由は私には意味がありません。
すべての変数を一時保持変数にコピーし、さまざまな変数をデバッグおよびワーカー関数に渡すことはまだ試みていません。問題は、その値が破損している理由がわかりません。値を -99 に初期化したため、変更されていますが、テスト ケースで -1 を返す必要があるときに、常に 0 として返されます。
事前に感謝します。うまくいけば、誰かが Dll の戻り値と Visual Studio ウォッチに表示されている間の変数をトレースする方法を提案できることを願っています。価値。
private UploadStatus SetRecord(int remoteId, string xmlDate, string val1, string val2, int val3, int recSeq, string name, int cat1, int cat, int seq, string val5, double val6)
{
UploadStatus status = new UploadStatus();
status.id = remoteId;
int RtnCode = -99;
int countRecSeq = Convert.ToInt16(ConfigurationManager.AppSettings["cycle-value"]); // value to cycle through for unique key
// Pad variables appropriately
val1 = val1 .PadRight(6, ' ');
val2 = val2 .PadRight(3, ' ');
val3 = val3 .PadRight(30, ' ');
xmlDate = xmlDate.PadRight(25, ' ');
val5 = val5.PadLeft(2, ' ');
errorTypes ErrCode;
try
{
if (debug)
{
string input = "remoteId: " + remoteId + "||\n" + "xmlDate: " + xmlDate + "||\n" + "val1: " + val1 + "||\n" + "val2: " + val2+ "||\n" + "val3: " + val3 + "||\n" + "recSeq: " + recSeq + "||\n" + "name: " + name + "||\n" + "cat1: " + cat1 + "||\n" + "cat: " + cat + "||\n" + "val4: " + val4 + "||\n" + "val5: " + val5 + "||\n" + "val6: " + val6 + "||\n" + "RtnCode: " + RtnCode + "||\n";
writeDebug("\n\n*** Start UploadStatus SetRecord(int remoteId, string xmlDate, string val1, string val2, int val3, int recSeq, string name, int cat1, int cat, int val4, string val5, double val6) ***\n" + input);
}
ErrCode = COBOL.SET_RECORD(ref xmlDate, ref val1, ref val2, ref val3, ref recSeq, ref name, ref cat1, ref cat, ref val4, ref val5, ref val6, " ", ref RtnCode);
// Add to recSeq looking for a unique key to insert
while (ErrCode == errorTypes.CS_OK && recSeq < countRecSeq && RtnCode == -1)
{ ...
private void writeDebug(string input)
{
string logText = DateTime.Now.ToShortDateString() + " " + DateTime.Now.TimeOfDay.ToString() + ": " + input;
try
{
if (!File.Exists(debugPath))
{
using (StreamWriter sw = File.CreateText(debugPath))
{
sw.Write(logText);
}
}
else
{
using (StreamWriter sw = File.AppendText(debugPath))
{
sw.Write(logText);
}
}
}
catch (Exception ex)
{
writeException(ex);
}
}