Jedidja
Jedidja

Reputation: 16970

Why is my app crashing in System.Windows.ni.dll on startup with no useful stack trace? (seemingly after adopting Caliburn.Micro)

  1. Start with the default "empty" Windows Phone App project (Windows Phone 8). Let's call it BlackAdder for fun.
  2. Add Caliburn.Micro from Nuget
  3. Move MainPage.xaml to the Views subdirectory and create a matching ViewModel in ViewModels\MainPageViewModel.cs
  4. Fix the namespace for MainPage to Blackadder.Views in both the .xaml and .xaml.cs files
  5. Update App.xaml

    <Application
    x:Class="BlackAdder.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:local="clr-namespace:BlackAdder">
    
    <Application.Resources>
        <local:Bootstrapper x:Key="bootstrapper"/>
    </Application.Resources>
    
    </Application>
    
  6. Update App.xaml.cs

    public partial class App : Application
    {        
        public static PhoneApplicationFrame RootFrame { get; private set; }
    
        public App()
        {
          InitializeComponent();
    
         // Show graphics profiling information while debugging.
          if (Debugger.IsAttached)
          {
              ...
          }
       }
    }
    
  7. Create Bootstrapper.cs

    public class Bootstrapper : PhoneBootstrapper
    {
      private PhoneContainer container;
    
      protected override void Configure()
      {
        container = new PhoneContainer();
    
        container.RegisterPhoneServices(RootFrame);
        container.PerRequest<MainPageViewModel>();
    
        AddCustomConventions();
      }
    
      protected static void AddCustomConventions()
      {
      }
    
      protected override object GetInstance(Type service, string key)
      {
        return container.GetInstance(service, key);
      }
    
      protected override IEnumerable<object> GetAllInstances(Type service)
      {
        return container.GetAllInstances(service);
      }
    
      protected override void BuildUp(object instance)
      {
        container.BuildUp(instance);
      }
    }
    

When we run the app, it crashes in a very weird place.

An unhandled exception of type 'System.Reflection.TargetInvocationException' occurred in System.Windows.ni.dll

Additional information: Exception has been thrown by the target of an invocation.

There is no inner exception, and the stack trace is (seemingly) useless.

System.Windows.ni.dll!System.Windows.Threading.DispatcherOperation.Invoke() System.Windows.ni.dll!System.Windows.Threading.Dispatcher.Dispatch(System.Windows.Threading.DispatcherPriority priority) System.Windows.ni.dll!System.Windows.Threading.Dispatcher.OnInvoke(object context) System.Windows.ni.dll!System.Windows.Hosting.CallbackCookie.Invoke(object[] args) System.Windows.RuntimeHost.ni.dll!System.Windows.RuntimeHost.ManagedHost.InvokeDelegate(System.IntPtr pHandle, int nParamCount, System.Windows.Hosting.NativeMethods.ScriptParam* pParams, System.Windows.Hosting.NativeMethods.ScriptParam* pResult)

Upvotes: 0

Views: 851

Answers (1)

Jedidja
Jedidja

Reputation: 16970

It turns out this has nothing to do with caliburn.micro at all. The problem lies in Properties\WMAppManifest.xaml.

After moving MainPage.xaml to the Views subdirectory, the Navigation Page setting (found on the first tab, Application UI) needs to be updated to Views\MainPage.xaml

Upvotes: 1

Related Questions