none
VB2008 開發專案執行時發生 "應用程式發生錯誤" RRS feed

  • 問題

  • 請教各位大大
    小弟在開發完專案後,在開發的PC中測試執行均OK..
    將專案安裝於USER的電腦後,執行時卻會發生以專案執行檔為名稱的 "應用程式發生錯誤"這個選擇"回報與不回報"的訊息視窗

    專案封裝時我已有把 .NET 3.5 封進去一起安裝了,因為沒有其他訊息.所以小弟很難判斷是程式何處錯誤!試問各位大大有哪些情況會造成這個異常呢?

    開發用的PC與USER端的PC只有作業系統不同..
    開發用的是Professional版SP3..
    USER端的是HOME版的SP2..從未做任何的XP韌體更新

    新手上路
    2009年11月19日 上午 06:29

解答

  • 我剛剛找了一台 Win2003 的,用遠端桌面抓圖下來,WinXP 應該是一樣的畫面:

    事件檢視器 應用程式 找個 .Net Runtime 2.0 Error 的事件, p1 ~ p9 就是上面問題簽章 01 ~ 09 ,p1 是 你的應用程式執行檔名,p4 是發生問題的 dll ,p9 是例外原因。

    這個例子是排程碰上網路磁碟出問題,發生找不到檔案,那隻程式也沒維護計畫,直接重新開機把問題解決掉,圖中那排錯誤都是同一天每個小時的排程,等發現的時候已經過半天了~


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 eblue 2009年11月23日 上午 03:25
    2009年11月19日 下午 12:44

所有回覆

  • [VB 2005]程式封包後出現的問題


    參考此篇有幫助嗎...

    2009年11月19日 上午 06:39
  • 感謝大大的回覆
    目前有些觀念想釐清一下
    程式進行是採多緒方式執行

    1.我的程式是經PC連至PLC取得的數據.所以是很單純的收送信,所以沒有OCX這個散布權的問題
    2.程式中也沒有參照任何DLL或COM元件
    3.委派:由每個執行緒去顯示各自的資訊.所以沒用到委派..(這邊會有風險嗎??)
    程式流程:
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            FORM_START()
            System.Threading.Thread.Sleep(300)
            CheckForIllegalCrossThreadCalls = False
            ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf READPLC), myResetEvent)
        End Sub
    Private Sub READPLC()
    DO
      For i As Integer = 0 To 4
      select case i
         case 0
             'PLC 收送信
              PLC_READ1(RXDbuff) '將取得的資料做運算並儲存
         case 1
          .
          .
     next
    LOOP
    End Sub

     Private Sub PLC_READ1(ByVal RXD() As String) '主畫面顯示資訊
            For item As Integer = 0 To 998
                mybuffer.MAIN_Buffer(item) = RXD(item)
            Next
            ChooseThreads(1) '觸發執行緒1
        End Sub
    Public Sub ChooseThreads(ByVal threadNumber As Integer)
               Select Case threadNumber
                    Case 1 'MAIN 資訊
                        System.Threading.Thread.EndThreadAffinity()
                        FactorialThread = New System.Threading.Thread(AddressOf MAIN_DISP)
                        FactorialThread.Start()
                   End Select
                End Sub
     Private Sub MAIN_DISP()  'MAIN 資訊
            Dim wait As Double
            wait = Microsoft.VisualBasic.Timer + 0.5
            Dim item As Integer
            Try
                For item = 0 To 35
                    Select Case item
                        Case item
                            Dim i As Integer = (20 * item)
                            '靶號
                            Dim RXD As Integer = System.Convert.ToInt16(mybuffer.MAIN_Buffer(i), 16)
                            DataGridView1.Rows(item + 1).Cells(3).Value = RXD
                            '料號
                            Dim RXD1 As Integer = System.Convert.ToInt16(mybuffer.MAIN_Buffer(i + 1), 16)
                            If RXD1 = 0 Then
                                DataGridView1.Rows(item + 1).Cells(4).Value = Nothing
                            Else
                                DataGridView1.Rows(item + 1).Cells(4).Value = mybuffer.PRODUCT(RXD1)
                                LOTCHECK(mybuffer.PRODUCT(RXD1))
                            End If
                            '批號
                            Dim RXD2 As Integer = System.Convert.ToInt16(mybuffer.MAIN_Buffer(i + 2), 16)
                            DataGridView1.Rows(item + 1).Cells(5).Value = mybuffer.LOTNAME(RXD2)
                            '片數
                            Dim RXD3 As Integer = System.Convert.ToInt16(mybuffer.MAIN_Buffer(i + 3), 16)
                            DataGridView1.Rows(item + 1).Cells(6).Value = RXD3
                            '面積
                            Dim RXD4 As Integer = System.Convert.ToInt16(mybuffer.MAIN_Buffer(i + 4), 16)
                            DataGridView1.Rows(item + 1).Cells(7).Value = RXD4
                         
                    End Select
                  Next
                Catch ex As Exception
                MsgBox(ex.Message, MsgBoxStyle.OkOnly, "生產資訊")
            End Try
        End Sub


    新手上路
    2009年11月19日 上午 07:23
  • 我之前遇過這樣的狀況 (請看Joe大給的連結)
    不過你的狀況和委派可能有關.
    雖然你用了  CheckForIllegalCrossThreadCalls = False ,
    不過事實上在MSDN有的地方有註解
    http://msdn.microsoft.com/zh-tw/library/system.windows.forms.control.checkforillegalcrossthreadcalls.aspx

    [以下引用自上方 MSDN文件庫連結內容]
    當控制項的建立執行緒以外的執行緒嘗試存取該控制項的其中一個方法或屬性時,它通常會導致無法預期的結果。常見的無效執行緒活動為在可存取控制項的 Handle 屬性之錯誤執行緒上呼叫。將 CheckForIllegalCrossThreadCalls 設定為 true ,可以在偵錯時更容易找到並診斷這種執行緒活動。請注意,如果在偵錯工具之外啟動應用程式,不當的跨執行緒呼叫總是會引發例外狀況。

    重點就是 請注意,如果在偵錯工具之外啟動應用程式,不當的跨執行緒呼叫總是會引發例外狀況。
    所以還是用委派吧
    學而不思則罔, 思而不學則殆.
    如果你一直都看不懂、不想學習看懂、抗拒看懂MSDN Library的話,那你最好放棄想要寫好程式這件事
    如果你自私地不肯回饋與分享,那別人為何要花時間回答你的問題?
    2009年11月19日 上午 08:12
    版主
  • 我正在努力它改成委派..哈!!關於委派的問題請大大在提點一下
    請問:
    1.每個UI控制項都要一個專屬的委派工作嗎?
    EX 若我有10各Label元件就必須要有10個委派宣告嗎?
    若我這樣做OK嗎??
    Public function TEST_DISP(ByVal str as string ,ByVal item as integer)
    TEST(str,item)
    end function
    Delegate Sub SetMsg5callback()
    Private Sub TEST(ByVal str as string ,ByVal item as integer)
     select case item
    case 1
          If Me.Label1.InvokeRequired Then
          Dim d As New  SetMsg5callback(AddtrssOf DISPLAYMAIN)
          Me.Invoke(d,New Object(){str})
          else
          Label1.text=str
          end if
           .
           .
    end select
    End sub
    2.如上面的程式小弟委派的方式是這樣: 這樣顯示是OK的..這樣小弟的想法對嗎?

    public function MAIN_DISP()
        DISPLAYMAIN()
    End Funtion
    Delegate Sub SetMsg6callback()
    Private Sub DISPLAYMAIN()
    If Me.DataGridView1.InvokeRequired Then
    Dim d As New  SetMsg6callback(AddtrssOf DISPLAYMAIN)
    Me.Invoke(d,New Object(){})
    else
     Try
                For item = 0 To 35
                   .
                   .
                   .
                Catch ex As Exception
                MsgBox(ex.Message, MsgBoxStyle.OkOnly, "生產資訊")
            End Try
    end if
     End Sub


    另外之前大大建議小弟不要去直接變更DataGridView中的東西,應該建立一個Table做為它資料的來源,但我這麼做的話
    DataGridView元建中的表格會有跳動.Cell錯亂的情況發生..所以小弟目前還是直接對該元件做變更

    新手上路
    2009年11月19日 上午 08:34
  • 如果委派的參數都一樣, 你可以只要delegate一次就可以了
    然後10個委派函式都參照這個委派
    學而不思則罔, 思而不學則殆.
    如果你一直都看不懂、不想學習看懂、抗拒看懂MSDN Library的話,那你最好放棄想要寫好程式這件事
    如果你自私地不肯回饋與分享,那別人為何要花時間回答你的問題?
    2009年11月19日 上午 08:45
    版主
  • 如果你是安裝到 Vista ,還沒回報前,你可以重新叫出詳細資料,回報過後,也可以暫時叫出可參考資訊:


    這個錯誤實際上是因為多緒同時更新 Access 資料庫,造成資料鎖死打結。
    你可以找台 Vista 測看看,因為有錯誤訊息對於除錯是滿必要的,你這樣寫實在沒辦法猜猜看。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2009年11月19日 上午 08:56

  • 委派的參數都不同!但是都是針對label元件如label1=D0的值......label10=D10的值,如此

    必須要寫10各委派的函數囉

    因為我用我剛剛想的方式!在顯示上是OK的
    這邊變一下
    case1     
          If Me.Label1.InvokeRequired Then
          Dim d As New  SetMsg5callback(AddtrssOf DISPLAYMAIN)
          Me.Invoke(d,New Object(){str,item})
          else
          Label1.text=str
          end if
    case 2
    If Me.Label2.InvokeRequired Then
          Dim d As New  SetMsg5callback(AddtrssOf DISPLAYMAIN)
          Me.Invoke(d,New Object(){str,item})
          else
          Label2.text=str
          end if
    ...
    新手上路
    2009年11月19日 上午 09:12
  • 用Select Case 弄成一個function也無不可. 只要判斷式正確處理就好了.

    學而不思則罔, 思而不學則殆.
    如果你一直都看不懂、不想學習看懂、抗拒看懂MSDN Library的話,那你最好放棄想要寫好程式這件事
    如果你自私地不肯回饋與分享,那別人為何要花時間回答你的問題?
    2009年11月19日 上午 09:28
    版主
  • 感謝心冷大大的意見..在發問前小弟也想過這個錯誤訊息不是那麼好發問..因為沒有異常訊息或是代碼出現.
    目前小弟的方針有2..
    1.將UI的部分用委派來做
    2.經由大大的舉例..我會再掃一遍更新Access資料庫的部分


    新手上路
    2009年11月19日 上午 09:35
  • 2. 的部分,重點是看那個畫面是哪個元件引起的,才能縮小範圍除錯。

    例子的話我還有阿~ 比如說下面這段 (圖上左下角有複製到剪貼簿)

    這個問題是透過 WebClient 抓的網頁變更,然後造成 VB 命名空間下某個指令錯誤造成。


    問題 已停止運作
    日期 2009/11/16 下午 12:20
    狀態 報告已傳送
    描述 Stopped working

    問題簽章
    問題事件名稱: CLR20r3
    問題簽章 01: 
    問題簽章 02: 1.0.3607.21804
    問題簽章 03: 4b00cfd8
    問題簽章 04: Microsoft.VisualBasic
    問題簽章 05: 8.0.0.0
    問題簽章 06: 49cc7d22
    問題簽章 07: 35f
    問題簽章 08: 36
    問題簽章 09: System.InvalidCastException
    作業系統版本: 6.0.6002.2.2.0.274.10
    地區設定識別碼: 1028

    問題的額外資訊
    陣列識別碼: 827058962



    這個問題無法重現,就擺爛到死了... 一年來每天都跑兩次的排程,只錯了這麼一次,所以不知道可能原因。


    問題 已停止運作
    日期 2009/5/4 上午 04:50
    狀態 報告已傳送
    描述 Stopped working

    問題簽章
    問題事件名稱: CLR20r3
    問題簽章 01: 
    問題簽章 02: 0.1.0.0
    問題簽章 03: 466e0eb0
    問題簽章 04: System.Windows.Forms
    問題簽章 05: 2.0.0.0
    問題簽章 06: 4889dee7
    問題簽章 07: 14d2
    問題簽章 08: 23
    問題簽章 09: System.ObjectDisposedException
    作業系統版本: 6.0.6002.2.2.0.274.10
    地區設定識別碼: 1028

    問題的額外資訊
    陣列識別碼: 559163625


     


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2009年11月19日 上午 10:10
  • 因為我沒VISTA的作業系統所無法像大大這樣看..不過您提的都是方向
    因為程式灌好上線使用!我在現場也測了3天!今天是RUN第6天了..
    也就是說今天才一直出現"應用程式錯誤".重開也沒用
    但是今天來提問也是有收穫.各位大大的意見幫我改善了不少風險
    至於資料庫的部分..雖然有多執行緒會去讀寫.但因為程式操作上我已將他錯開
    所以不會有同時去做的風險在..

    新手上路
    2009年11月19日 上午 10:20
  • 我剛剛找了一台 Win2003 的,用遠端桌面抓圖下來,WinXP 應該是一樣的畫面:

    事件檢視器 應用程式 找個 .Net Runtime 2.0 Error 的事件, p1 ~ p9 就是上面問題簽章 01 ~ 09 ,p1 是 你的應用程式執行檔名,p4 是發生問題的 dll ,p9 是例外原因。

    這個例子是排程碰上網路磁碟出問題,發生找不到檔案,那隻程式也沒維護計畫,直接重新開機把問題解決掉,圖中那排錯誤都是同一天每個小時的排程,等發現的時候已經過半天了~


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 eblue 2009年11月23日 上午 03:25
    2009年11月19日 下午 12:44
  • 受用啊!!感謝大大提供的資訊..明天小弟到現場試試!感謝


    新手上路
    2009年11月19日 下午 01:52
  • 不好意思小弟貼圖一直都失敗!所以用字面敘述依照大大MARK的地方的資訊

    P4:Microsoft.visualbasic
    P9:system.invalidcastexception

    看來很像是字串在轉換時所造成的例外!!是這樣嗎??


    新手上路
    2009年11月20日 上午 03:25
  • [Visual Studio 偵錯工具 疑難排解例外狀況:System.InvalidCastException ]

    另外可能和主題無關
    Dim RXD As Integer = System.Convert.ToInt16(mybuffer.MAIN_Buffer(i), 16)
    ToInt16 回傳是 Short, 如果是Integer應該是ToInt32
    而且為何它的 fromBase參數是16 ? 你的mybuffer.MAIN_Buffer中的元素是16進位的字串嗎 ?


    學而不思則罔, 思而不學則殆.
    如果你一直都看不懂、不想學習看懂、抗拒看懂MSDN Library的話,那你最好放棄想要寫好程式這件事
    如果你自私地不肯回饋與分享,那別人為何要花時間回答你的問題?
    2009年11月20日 上午 05:45
    版主
  • 是的!由PLC丟出來的值是16進制的沒錯
    所以小弟要將他轉成10進制來顯示或是運算 所以應該將RXD宣告成Short嗎??這不是只有所佔的記憶體大小的差別嗎??
    新手上路
    2009年11月20日 上午 06:48
  • 是的!由PLC丟出來的值是16進制的沒錯
    所以小弟要將他轉成10進制來顯示或是運算 所以應該將RXD宣告成Short嗎??這不是只有所佔的記憶體大小的差別嗎??
    新手上路

         所以我說是題外話, 不過通常會朝向儘量相同的型別去做, 因為哪天如果你要改用C#, 強型別的要求就會變的很重要.
         你可以都宣告成Integer. 在CLR中處理Integer比Short快

    學而不思則罔, 思而不學則殆.
    如果你一直都看不懂、不想學習看懂、抗拒看懂MSDN Library的話,那你最好放棄想要寫好程式這件事
    如果你自私地不肯回饋與分享,那別人為何要花時間回答你的問題?
    2009年11月20日 上午 09:05
    版主
  • 通訊途中,有時可能會有雜訊 (或稱亂碼) ,你有考慮過這部分的問題嗎?
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2009年11月20日 下午 05:20
  • 雜訊的部分!小弟的確沒考慮到
    但這次的問題小弟有找到原因了
    在數值的傳遞出了問題
      Public Sub DOSING_S(ByVal ITEM As Integer, ByVal DOSING_NAME As String) 'DOSING開始 寫入暫存區
            Try
                mybuffer.Dosing_BUFFER.Rows(ITEM).Item(1) = Mid(Format(Now.Date, "yyyy/MM/dd"), 1, 10)
                mybuffer.Dosing_BUFFER.Rows(ITEM).Item(2) = Now.Hour & ":" & Now.Minute & ":" & Now.Second
                mybuffer.Dosing_BUFFER.Rows(ITEM).Item(4) = DOSING_NAME
            Catch ex As Exception
                MsgBox(ex.Message, MsgBoxStyle.Information, "DOSING自動添加記錄暫存")
            End Try
       End Sub

    在某一段偵測時小弟KEY太快將這個
    NAME="PUMP#1"
    ITEM=2
    DOSING_S(NAME,ITEM) '這邊出錯了!
    就這行!因為久久才執行到行程式碼,所以看不出來!
    這也是小弟在一開始程式除錯時沒注意到的
    感謝大大的協助


    新手上路
    2009年11月23日 上午 03:25