2013-02-08 75 views
0

我有一种情况对我来说似乎很奇怪。我在C#中有一个WCF Web服务,我有一些我写入的调试代码,它打开一个文件并写入一些关于当前变量值的行并关闭文件。这是我关闭和开启的功能,具体取决于是否需要使用它来调试客户位置的某些内容。从DLL调用返回后,变量值的值不正确

对于所有的读写功能,它与在后台执行COBOL代码以访问旧数据存储系统的DLL进行交互。所有变量都通过引用传入,返回的数据通过那些相同的引用变量返回。大多数情况下,变量只是初始化为正确的大小,并传入并将数据返回给我。函数的返回类型是COBOL环境中执行的所有状态,这些状态告诉你程序是否未加载/初始化正常,如果执行正常等等。所有写入返回0成功和-1失败。

在我对这个DLL的所有调用之前和之后,我有我的调试代码,所以我可以看到之前和之后的值。调试功能只是写入一个FileStream并返回。我通过值传递相同的变量到我传递给我的工作函数作为引用的调试功能。

当我打开我的调试开关时,奇怪的东西开始发生。在1-2次调用之后,辅助函数在成功/失败代码中的值为0。当然,我的逻辑认为0是成功写入数据文件,所以我错误地报告写入工作正常。调试DLL,你可以明确地看到它返回-1,试图通知Web服务写入失败,在我的情况下是正确的,因为发生了重复密钥违规。当值显示在Visual Studio手表中时,它以某种方式变为0,表示成功。

我无法环绕我的大脑的事情是,如果我关闭我的调试开关。这将关闭我的FileStream编写器,我通过值传递变量,然后通过引用传递给我的工作者函数,一切都按照它应该的方式工作。 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); 
    } 
} 
+2

'Martin'感谢您与我们分享您的生活故事..但我认为代码样品会更适合您的情况。 – MethodMan 2013-02-08 16:08:28

+0

认真吗?甚至没有一行代码给我们提供线索? – Polyfun 2013-02-08 16:10:06

+0

你如何使用FileWriter?你是否正在使用“使用(FileWriter fw = ...){}”,以便正确刷新,关闭和丢弃该流?是否同时写入文件? – 2013-02-08 16:11:29

回答

0

最终,我解决了这个问题。如果用于写入数据的密钥与另一个密钥匹配,原本该函数将返回失败。在该代码中,我们只是将其开发为增加到下一个键。问题可能仍然存在,但由于该功能最终会找到使用的关键,因此它总是成功的。

此后,供应商对COBOL和.NET interopt进行了改进。另外,我们彻底改变了他们在语言之间进行交流的方式,这些语言似乎更加稳定。

相关问题