首页 文章

在.NET 4.0中构造对象时出现System.NullReferenceException

提问于
浏览
1

我刚刚完成了将大型解决方案从.NET 3.5迁移到4.0的任务 . 相当直接和应用程序运行没有事故 . 但是,当我尝试打开其中一个子窗口时,我得到以下异常:

类型:System.NullReferenceException,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089消息:对象引用未设置为对象的实例 . 来源:WindowsBase帮助链接:数据:System.Collections.ListDictionaryInternal TargetSite:System.String AntiFormat(System.String)堆栈跟踪:MS.Internal.AvTrace.AntiFormat(String s)at MS.Internal.AvTraceBuilder.AppendFormat(String message) ,字符串arg1,字符串arg2)位于MS.Internal.TraceData.DescribeTarget(AvTraceBuilder traceBuilder,DependencyObject targetElement,DependencyProperty targetProperty)上的MS.Internal.TraceData.DescribeSourceObject(AvTraceBuilder traceBuilder,Object o),位于MS.Internal.TraceData.Describe(AvTraceBuilder)在MS.Internal.AraceTrace.Trace的MS.Internal.TraceData.OnTrace(AvTraceBuilder traceBuilder,Object []参数,Int32 start)上的traceBuilder,Object o)(TraceEventType类型,Int32 eventId,String消息,String []标签,Object [ MS.Internal.Data.PropertyPathWorker.R上的MS.Internal.Data.PropertyPathWorker.ReportNoInfoError(Int32 k,Object parent)中的MS.Internal.TraceData.Trace(TraceEventType类型,AvTraceDetails traceDetails,Object p1)的参数) System.Windows上MS.Internal.Data.ClrBindingWorker.AttachDataItem()的MS.Internal.Data.PropertyPathWorker.UpdateSourceValueState(Int32 k,ICollectionView collectionView,Object newValue,Boolean isASubPropertyChange)中的eplaceItem(Int32 k,Object newO,Object parent)位于System.Windows.Data.BindingExpressionBase的System.Windows.Data.BindingExpression.AttachOverride(DependencyObject目标,DependencyProperty dp)的System.Windows.Data.BindingExpression.AttachToContext(AttachAttempt尝试)处的.Data.BindingExpression.Activate(Object item) . 在System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp,Object value,PropertyMetadata metadata,Boolean coerceWithDeferredReference,Boolean coerceWithCurrentValue,OperationType)上的System.Windows.Data.BindingExpressionBase.OnAttach(DependencyObject d,DependencyProperty dp)中附加(DependencyObject目标,DependencyProperty dp) System.Windows.DependencyObject.SetValue(DependencyProperty dp,Objec)中的operationType,Boolean isInternal)在MS.Internal.Xaml.Runtime的MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(XamlMember成员,对象obj,对象值)的System.Windows.Baml2006.WpfMemberInvoker.SetValue(对象实例,对象值)处的t值) System.Xaml.XamlObjectWriter.Logic_ApplyPropertyValue上的System.Xaml.XamlObjectWriter.SetValue(Object inst,XamlMember属性,Object value)中的.ClrObjectRuntime.SetValue(Object inst,XamlMember属性,Object value)(ObjectWriterContext ctx,XamlMember prop,Object value, System.Xaml.Xam上的System.Xaml.XamlObjectWriter.Logic_DoAssignmentToParentProperty(ObjectWriterContext ctx)中System.Xaml.XamlObjectWriter.WriteEndObject()的System.Xaml.XamlObjectWriter.Logic_DoAssignmentToParentProperty(ObjectWriterContext ctx)处的布局onParent),位于System.Xaml.XamlWriter.WriteNode(XamlReader reader)处System.Windows.Markup.WpfXamlLoader.TransformNodes(XamlReader xamlReader,XamlObjectWriter xamlWriter,Boolean onlyLoadOneNode,Boolean skipJournaledProperties,Boolean shouldPassLineNumberInfo,IXamlLine信息xamlLineInfo,IXamlLineInfoConsumer xamlLineInfoConsumer,XamlContextStack1栈,IStyleConnector styleConnector)在System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader,IXamlObjectWriterFactory writerFactory,布尔skipJournaledProperties,在System.Windows.Markup对象rootObject,XamlObjectWriterSettings设置,开放的基本URI) . System.Windows.Application.LoadComponent上的System.Windows.Markup.XamlReader.LoadBaml(Stream stream,ParserContext parserContext,Object parent,Boolean closeStream)中的WpfXamlLoader.LoadBaml(XamlReader xamlReader,Boolean skipJournaledProperties,Object rootObject,XamlAccessLevel accessLevel,Uri baseUri) (对象组件,Uri resourceLocator)位于OCC600.LogManager.LogViewer.InitializeComponent()位于c:\ dev \ LUT600 2.1.1 \ OCC600 \ DotNet4 \ Source \ LogManager \ LogManager \ Views \ LogViewer.xaml:第1行位于OCC600.LogManager C:\ dev \ LUT600中的.LogViewer..ctor(LogsViewModel模型,LogMessage日志)2.1.1 \ OCC600 \ DotNet4 \ Source \ LogManager \ LogManager \ Views \ LogViewer.xaml.cs:位于C:\ dev \ LUT600 2.1的OCC600.LogManager.Models.LogsViewModel.CreateDataItemDetailsWindow(LogMessage dataItem,Int64 key)的第31行 . 1 \ OCC600 \ DotNet4 \ Source \ LogManager \ LogManager \ Models \ LogsViewModel.cs:第163行在ControlsLibrary.wpf.GenericViewModel2.OpenDataItemDetailsWindow(T dataItem,Int64 windowKey,Boolean trackWindow)中的C:\ dev \ LUT600 2.1.1 \ OCC600 \ DotNet4 \ Source \ Libraries \ ControlsLibrary \ Utility \ GenericViewModel.cs:第163行,位于C:\ dev \ LUT600 2.1.1 \ OCC600 \ DotNet4 \ Source \中的OCC600.LogManager.Models.LogsViewModel.OpenLogDetailsWindow(LogMessage日志) LogManager \ LogManager \ Models \ LogsViewModel.cs:位于C:\ dev \ LUT600 2.1.1 \ OCC600 \ DotNet4 \ Source \ LogManager \ LogManager \的OCC600.LogManager.Models.LogsViewModel.DisplayDetails(IEnumerable data,Boolean trackWindows)中的第190行Models \ LogsViewModel.cs:位于C:\ dev的OCC600.LogManager.LogsView.logDataGrid_PreviewMouseDoubleClick(Object sender,MouseButtonEventArgs e)的第176行\ LUT600 2.1.1 \ OCC600 \ DotNet4 \ Source \ LogManager \ LogManager \ Views \ LogsView.xaml.cs:在System.Windows.RoutedEventArgs的System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler,Object genericTarget)中的第201行 . 位于System.Windows.Uindlement.RaiseEventImpl的System.Windows.EventRoute.InvokeHandlersImpl(Object source,RoutedEventArgs args,Boolean reRaised)的System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target,RoutedEventArgs routedEventArgs)中的InvokeHandler(委托处理程序,Object目标)( System.Windows.Controls.Control.HandleDoubleClick(Object sender,MouseButtonEventArgs e)处的System.Windows.Controls.Control.OnMouseDoubleClick(MouseButtonEventArgs e)处的System.Windows.UIElement.RaiseEvent(RoutedEventArgs e)处的DependencyObject发送者,RoutedEventArgs args) System.Windows.RindtedEventArgs.InvokeHandler(委托处理程序,对象目标)处的System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(委托genericHandler,Object genericTarget)在System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender,RoutedEventArgs args,RoutedEvent newEvent)的System.Windows.EventRoute.InvokeHandlersImpl(Object source,RoutedEventArgs args,Boolean reRaised)中的System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target,RoutedEventArgs routedEventArgs)在System.Windows.UIElement.OnMouseDownThunk(Object sender,MouseButtonEventArgs e)的System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler,Object genericTarget)处于System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler,Object target)的System处 . System.Windows上的System.Windows.UIElement.RaiseEventImpl(DependencyObject sender,RoutedEventArgs args)上的System.Windows.EventRoute.InvokeHandlersImpl(Object source,RoutedEventArgs args,Boolean reRaised)中的Windows.RoutedEventHandlerInfo.InvokeHandler(Object target,RoutedEventArgs routedEventArgs) . System.Windows.UIElement.RaiseEvent(路由)中的UIElement.RaiseTrustedEvent(RoutedEventArgs args) System.Windows上System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)的System.Windows.Input.InputManager.ProcessInput(InputEventArgs输入)中的System.Windows.InputManager.ProcessStagingArea()处的dEventArgs args,布尔值信任) System.Windows.Interop.HwndMouseInputProvider.FilterMessage中的.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd,InputMode mode,Int32 timestamp,RawMouseActions actions,Int32 x,Int32 y,Int32 wheel)(IntPtr hwnd,WindowMessage msg,IntPtr wParam,IntPtr lParam ,System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd,Int32 msg,IntPtr wParam,IntPtr lParam,Boolean&handling)at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd,Int32 msg,IntPtr wParam,IntPtr lParam) ,布尔和处理)MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback,Object args,Int32 numArgs)at MS.Internal.Threading.ExceptionFilterHelper . TryCatchWhen(Object source,Delegate方法,Object args,Int32 numArgs,Delegate catchHandler)

违规行是:

<cdic:TextViewer Text="{Binding Message}" Grid.Row="1"/>

在以下上下文中定义:

<Grid Name="dGrid" >
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <Border Margin="0,5,0,5" >                 
            </Border>
            <cdic:TextViewer Text="{Binding Message}" Grid.Row="1"/>            
        </Grid>

在调用以下构造函数中定义的InitializeComponent()期间抛出此异常:

public LogViewer(LogsViewModel model, LogMessage log)
        {
            this.myKey = log.Key;
            this.DataContext = model;                               
            InitializeComponent();

            dGrid.DataContextChanged += delegate
            {
                if (dGrid.DataContext != null)
                    this.Title = string.Format(LocalizedStrings.LogDetails + ": {0}",
                        (dGrid.DataContext as LogMessage).ToString());
            };

            dGrid.DataContext = log;
        }

我在.NET 3.5中没有这个问题 . 关于如何解决这个问题的任何想法?

3 回答

  • 2

    抛出错误的行看起来像是来自自定义控件,它可能是TextViewer控件不喜欢.net 4.如果您有权访问源代码,那么我会尝试从项目的其余部分单独编译/测试该控件以隔离问题 .

  • 2

    如果我在XAML中使用添加x:Name属性到我的自定义控件,问题就会消失 .

    所以,

    <cdic:TextViewer x:Name="textViewer" Text="{Binding Message}" Grid.Row="1"/>
    

    在下列情况下不会抛出异常:

    <cdic:TextViewer Text="{Binding Message}" Grid.Row="1"/>
    

    确实 .

  • 0

    从各个网站上关于这个问题的信息来看,似乎在某些情况下(例如Visual Studio中的调试模式),当Name属性设置为null或某些时,这个问题可能发生在 TextViewerTabItemTreeViewItem 和其他类型的控件上无效值,例如以数字开头的名称(例如"0name") .

    修复违规的 Name 属性可以解决此问题 .

相关问题