2016-12-01 40 views
1

我有一個最初在VS2010中創建的Windows窗體應用程序。我已經將它遷移到VS2013和VS2015。該應用程序編譯罰款,並在VS2015中運行,但如果我嘗試打開一個特定的形式,設計師崩潰給了以下錯誤:帶有UserControl的窗體在VS2013中打開,但不在VS2015中打開

Error HRESULT E_FAIL has been returned from a call to a COM component. 

它不給導致錯誤的代碼行,但它確實給調用棧如下:

at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo) 
at Microsoft.VisualStudio.LanguageServices.Implementation.Utilities.Exceptions.ThrowEFail() 
at Microsoft.VisualStudio.LanguageServices.Implementation.CodeModel.CodeTypeRef.LookupTypeSymbol() 
at Microsoft.VisualStudio.LanguageServices.Implementation.CodeModel.CodeTypeRef.get_TypeKind() 
at EnvDTE.CodeTypeRef.get_TypeKind() 
at Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomParser.GetUrtTypeFromVsType(CodeTypeRef vsType) 
at Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomParser.OnTypePopulateMembers(Object sender, EventArgs e) 
at System.CodeDom.CodeTypeDeclaration.get_Members() 
at Microsoft.VisualStudio.Design.Serialization.CodeDom.MergedCodeDomParser.CodeTypeDeclarationPopulator.OnPopulateMembers(Object sender, EventArgs e) 
at System.CodeDom.CodeTypeDeclaration.get_Members() 
at System.ComponentModel.Design.Serialization.TypeCodeDomSerializer.Deserialize(IDesignerSerializationManager manager, CodeTypeDeclaration declaration) 
at System.ComponentModel.Design.Serialization.CodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager manager) 
at Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager serializationManager) 
at Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomDesignerLoader.DeferredLoadHandler.Microsoft.VisualStudio.TextManager.Interop.IVsTextBufferDataEvents.OnLoadCompleted(Int32 fReload) 

我敢肯定它的事實,我用的是表上自定義控件做。爲自定義控件的代碼如下:

Public Class ctlServiceItem 
Implements IComponent 

Private _SelectedItem As AP_Data.AP_InvoiceService.SelectedItemEnum = AP_Data.AP_InvoiceService.SelectedItemEnum.NA 
Public Event SelectedItemChanged As EventHandler 
Public Property SelectedItem As AP_Data.AP_InvoiceService.SelectedItemEnum 
    Get 
     Return _SelectedItem 
    End Get 
    Set(value As AP_Data.AP_InvoiceService.SelectedItemEnum) 
     _SelectedItem = value 
     Select Case SelectedItem 
      Case AP_Data.AP_InvoiceService.SelectedItemEnum.NA 
       rbNA.Checked = True 
      Case AP_Data.AP_InvoiceService.SelectedItemEnum.OK 
       rbOK.Checked = True 
      Case AP_Data.AP_InvoiceService.SelectedItemEnum.Replaced 
       rbReplaced.Checked = True 
      Case AP_Data.AP_InvoiceService.SelectedItemEnum.Required 
       rbRequired.Checked = True 
      Case AP_Data.AP_InvoiceService.SelectedItemEnum.Suggested 
       rbSuggested.Checked = True 
     End Select 
     RaiseEvent SelectedItemChanged(Me, EventArgs.Empty) 
    End Set 
End Property 

Public Property HeaderText As String 
    Get 
     Return GroupBox1.Text 
    End Get 
    Set(value As String) 
     GroupBox1.Text = value 
    End Set 
End Property 

Private _Added As Boolean 
Public Property Added As Boolean 
    Get 
     Return _Added 
    End Get 
    Set(value As Boolean) 
     _Added = value 
     If _Added Then 
      rbReplaced.Text = "Added" 
     Else 
      rbReplaced.Text = "Replaced" 
     End If 
    End Set 
End Property 

Private Sub rbOK_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles rbOK.CheckedChanged 
    _SelectedItem = AP_Data.AP_InvoiceService.SelectedItemEnum.OK 
    RaiseEvent SelectedItemChanged(Me, EventArgs.Empty) 
End Sub 

Private Sub rbSuggested_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles rbSuggested.CheckedChanged 
    _SelectedItem = AP_Data.AP_InvoiceService.SelectedItemEnum.Suggested 
    RaiseEvent SelectedItemChanged(Me, EventArgs.Empty) 
End Sub 

Private Sub rbRequired_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles rbRequired.CheckedChanged 
    _SelectedItem = AP_Data.AP_InvoiceService.SelectedItemEnum.Required 
    RaiseEvent SelectedItemChanged(Me, EventArgs.Empty) 
End Sub 

Private Sub rbReplaced_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles rbReplaced.CheckedChanged 
    _SelectedItem = AP_Data.AP_InvoiceService.SelectedItemEnum.Replaced 
    RaiseEvent SelectedItemChanged(Me, EventArgs.Empty) 
End Sub 

Private Sub rbNA_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles rbNA.CheckedChanged 
    _SelectedItem = AP_Data.AP_InvoiceService.SelectedItemEnum.NA 
    RaiseEvent SelectedItemChanged(Me, EventArgs.Empty) 
End Sub 

End Class 

的其他控制是

Public Class ctlServiceTireItem 
Implements IComponent 

Private _SelectedItem As AP_Data.AP_InvoiceService.SelectedItemEnum = AP_Data.AP_InvoiceService.SelectedItemEnum.NA 
Public Event SelectedItemChanged As EventHandler 
Public Property SelectedItem As AP_Data.AP_InvoiceService.SelectedItemEnum 
    Get 
     Return _SelectedItem 
    End Get 
    Set(value As AP_Data.AP_InvoiceService.SelectedItemEnum) 
     _SelectedItem = value 
     Select Case SelectedItem 
      Case AP_Data.AP_InvoiceService.SelectedItemEnum.NA 
       rbNA.Checked = True 
      Case AP_Data.AP_InvoiceService.SelectedItemEnum.OK 
       rbOK.Checked = True 
      Case AP_Data.AP_InvoiceService.SelectedItemEnum.Replaced 
       rbReplaced.Checked = True 
      Case AP_Data.AP_InvoiceService.SelectedItemEnum.Required 
       rbRequired.Checked = True 
      Case AP_Data.AP_InvoiceService.SelectedItemEnum.Suggested 
       rbSuggested.Checked = True 
     End Select 
     RaiseEvent SelectedItemChanged(Me, EventArgs.Empty) 
    End Set 
End Property 

Public Property HeaderText As String 
    Get 
     Return GroupBox1.Text 
    End Get 
    Set(value As String) 
     GroupBox1.Text = value 
    End Set 
End Property 

Private Sub rbOK_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles rbOK.CheckedChanged 
    _SelectedItem = AP_Data.AP_InvoiceService.SelectedItemEnum.OK 
    RaiseEvent SelectedItemChanged(Me, EventArgs.Empty) 
End Sub 

Private Sub rbSuggested_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles rbSuggested.CheckedChanged 
    _SelectedItem = AP_Data.AP_InvoiceService.SelectedItemEnum.Suggested 
    RaiseEvent SelectedItemChanged(Me, EventArgs.Empty) 
End Sub 

Private Sub rbRequired_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles rbRequired.CheckedChanged 
    _SelectedItem = AP_Data.AP_InvoiceService.SelectedItemEnum.Required 
    RaiseEvent SelectedItemChanged(Me, EventArgs.Empty) 
End Sub 

Private Sub rbReplaced_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles rbReplaced.CheckedChanged 
    _SelectedItem = AP_Data.AP_InvoiceService.SelectedItemEnum.Replaced 
    RaiseEvent SelectedItemChanged(Me, EventArgs.Empty) 
End Sub 

Private Sub rbNA_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles rbNA.CheckedChanged 
    _SelectedItem = AP_Data.AP_InvoiceService.SelectedItemEnum.NA 
    RaiseEvent SelectedItemChanged(Me, EventArgs.Empty) 
End Sub 

End Class 

我可以,如果需要的形式提供的設計代碼,但它是汗牛充棟。這些控件就像他們應該的那樣在工具箱中顯示爲項目控件。這只是沒有意義的,它會打開設計師罰款在一個版本的VS,但不是更新的版本。既然它在早期版本中工作,我真的希望它只是一個晦澀的設置或類似的東西。

更新:我試圖創建一個全新的空白表單。我能夠將控件拖到新窗體中,並且顯示正常。當我關閉表單並在設計器中重新打開表單時,我得到了與上面相同的錯誤。問題肯定與用戶控件有關。

+0

@LarsTech你爲什麼編輯我的主題?控制器將在設計器中打開。包含該控件的表單不會。 –

+0

很多標題包含「Windows窗體」這兩個詞,因爲標籤應該覆蓋這些信息。我試圖解決這個問題,而不打算改變這些信息。我再次編輯了標題。 – LarsTech

+0

@LarsTech謝謝 –

回答

0

我找到了答案,在 https://social.msdn.microsoft.com/Forums/en-US/97bfbff4-651c-47e4-8aaa-25fa2273b1b5/designer-crash-in-vs2015-in-windows-forms?forum=winformsdesigner

底部出於某種原因,我有一個參考的項目我自己的項目。我認爲這是讓項目在早期版本的Visual Studio中識別自己的控件的一個技巧。看起來這是在VS 2015中修復的。一旦該項目沒有對自身的引用,那麼帶有用戶控件的表單顯示正常。