我的情况对我来说似乎很奇怪。我在C#中有一个WCF Web服务,我在其中写了一些调试代码,它打开一个文件并写一些关于当前变量值的行并关闭文件。这是我关闭和打开的功能,具体取决于我是否需要使用它来在客户的位置进行调试。
对于所有读写函数,它与在后台执行COBOL代码的DLL交互以访问遗留数据存储系统。所有变量都通过引用传入,返回的数据通过相同的引用变量返回。大多数情况下,变量只是初始化为正确的大小并传入并将数据返回给我。函数的返回类型是COBOL环境中执行的所有状态,告诉您程序是否未加载/初始化,如果执行正常,等等。所有写入返回0成功和-1失败。
在我对这个DLL的所有调用之前和之后,我都有我的调试代码,所以我可以看到之前和之后的值。调试函数只是在FileStream中写入一行并返回。我通过值将相同的变量传递给我将调试函数作为参考传递给我的worker函数。
当我打开调试开关时,奇怪的东西开始发生。在1-2次调用之后,worker函数在成功/失败代码中继续保持值0。当然,我的逻辑认为0是对数据文件的成功写入,因此我错误地报告了写入工作正常。调试dll,你可以专门看到它返回-1,试图通知Web服务写入失败,这在我的情况下是正确的,因为发生了重复的密钥冲突。当值显示在Visual Studio监视器中时,它以某种方式变为0,表示成功。
如果我关闭调试开关,那么我无法绕过脑袋的事情就是这样。这会关闭我的FileStream编写器,我按值传递变量,然后通过引用传递给我的worker函数,一切都按照应有的方式工作。来自Dll的值正确显示成功/失败应该如此。对我来说,为什么返回值会被破坏是没有意义的。
我还没有尝试将所有变量复制到临时保存变量,并将不同的变量传递给调试和工作者函数。问题是,我不明白为什么这个价值被破坏了。它正在被更改,因为我将值初始化为-99,但它总是返回0,在我的测试用例中它应该返回-1。
在此先感谢,希望有人可以建议如何跟踪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);
}
}
答案 0 :(得分:0)
最终,我解决了这种情况。如果用于写入数据的键与另一个键匹配,则该函数最初将返回失败。在该代码中,我们只是将其开发为增量到下一个键。问题可能仍然存在,但由于该函数最终会找到要使用的密钥,因此它总是成功的。
此后,供应商对COBOL和.NET interopt进行了改进。此外,我们完全改变了我们在语言之间进行通信的方式,这似乎更稳定。