2013-02-08 69 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進行了改進。另外,我們徹底改變了他們在語言之間進行交流的方式,這些語言似乎更加穩定。

相關問題