[英]Form with UserControl opens in VS2013 but not in VS2015
我有一個最初在VS2010中創建的Windows窗體應用程序。 我已經將它遷移到VS2013和VS2015。 應用程序編譯正常並在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
如果需要,我可以為表單提供設計器代碼,但它很龐大。 控件在工具箱中顯示為Project控件,就像它們應該的那樣。 它只是在一個版本的VS而不是更新的版本中在設計師中打開是沒有意義的。 因為它確實在早期版本中工作,所以我真的希望它只是一個模糊的設置或類似的東西。
更新:我嘗試創建一個全新的空白表單。 我能夠將控件拖到新表單上,它們顯示正常。 當我關閉表單並在設計器中重新打開它時,我得到了與上面相同的錯誤。 問題肯定在於用戶控件。
我在https://social.msdn.microsoft.com/Forums/en-US/97bfbff4-651c-47e4-8aaa-25fa2273b1b5/designer-crash-in-vs2015-in-windows-forms的底部找到了答案?論壇= winformsdesigner
出於某種原因,我在項目中引用了我自己的項目。 我認為這是讓早期版本的Visual Studio中的項目識別自己的控件的技巧。 看起來這是在VS 2015中修復的。一旦項目沒有自己的引用,帶有用戶控件的表單顯示正常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.