将XNA添加到Silverlight WP7项目

将XNA添加到Silverlight WP7项目,silverlight,windows-phone-7,xna,nullreferenceexception,Silverlight,Windows Phone 7,Xna,Nullreferenceexception,我目前正在为WP7制作一个游戏,它主要是在Silverlight中制作的。但现在我需要一个可以使用XNA的页面。XNA页面将接收战斗数据,然后为用户可视化 我尝试在我的解决方案中创建一个“Windows Phone Silverlight和XNA”项目(BattleSimulator),并导航到GamePage.xaml。但是我在(Application.Current as App)上得到一个NullReferenceException和一个警告。警告在战场模拟器项目中 警告 Warning

我目前正在为WP7制作一个游戏,它主要是在Silverlight中制作的。但现在我需要一个可以使用XNA的页面。XNA页面将接收战斗数据,然后为用户可视化

我尝试在我的解决方案中创建一个“Windows Phone Silverlight和XNA”项目(BattleSimulator),并导航到GamePage.xaml。但是我在(Application.Current as App)上得到一个NullReferenceException和一个警告。警告在战场模拟器项目中

警告

Warning 1   The project 'BattleSimulatorLib' cannot be referenced.  The referenced project is targeted to a different framework family (.NETFramework)  
代码

 public GamePage()
    {
        InitializeComponent();

        // Get the content manager from the application
        contentManager = (Application.Current as App).Content; //NullReference here
   at BattleSimulator.GamePage..ctor()
   at System.Reflection.RuntimeConstructorInfo.InternalInvoke(RuntimeConstructorInfo rtci, BindingFlags invokeAttr, Binder binder, Object parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess, StackCrawlMark& stackMark)
   at System.Reflection.RuntimeConstructorInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, StackCrawlMark& stackMark)
   at System.Activator.InternalCreateInstance(Type type, Boolean nonPublic, StackCrawlMark& stackMark)
   at System.Activator.CreateInstance(Type type)
   at System.Windows.Navigation.PageResourceContentLoader.BeginLoad_OnUIThread(AsyncCallback userCallback, PageResourceContentLoaderAsyncResult result)
   at System.Windows.Navigation.PageResourceContentLoader.<>c__DisplayClass4.<BeginLoad>b__0(Object args)
   at System.Reflection.RuntimeMethodInfo.InternalInvoke(RuntimeMethodInfo rtmi, Object obj, BindingFlags invokeAttr, Binder binder, Object parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess, StackCrawlMark& stackMark)
   at System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, StackCrawlMark& stackMark)
   at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
   at System.Delegate.DynamicInvokeOne(Object[] args)
   at System.MulticastDelegate.DynamicInvokeImpl(Object[] args)
   at System.Delegate.DynamicInvoke(Object[] args)
   at System.Windows.Threading.DispatcherOperation.Invoke()
   at System.Windows.Threading.Dispatcher.Dispatch(DispatcherPriority priority)
   at System.Windows.Threading.Dispatcher.OnInvoke(Object context)
   at System.Windows.Hosting.CallbackCookie.Invoke(Object[] args)
   at System.Windows.Hosting.DelegateWrapper.InternalInvoke(Object[] args)
   at System.Windows.RuntimeHost.ManagedHost.InvokeDelegate(IntPtr pHandle, Int32 nParamCount, ScriptParam[] pParams, ScriptParam& pResult)
Stacktrace

 public GamePage()
    {
        InitializeComponent();

        // Get the content manager from the application
        contentManager = (Application.Current as App).Content; //NullReference here
   at BattleSimulator.GamePage..ctor()
   at System.Reflection.RuntimeConstructorInfo.InternalInvoke(RuntimeConstructorInfo rtci, BindingFlags invokeAttr, Binder binder, Object parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess, StackCrawlMark& stackMark)
   at System.Reflection.RuntimeConstructorInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, StackCrawlMark& stackMark)
   at System.Activator.InternalCreateInstance(Type type, Boolean nonPublic, StackCrawlMark& stackMark)
   at System.Activator.CreateInstance(Type type)
   at System.Windows.Navigation.PageResourceContentLoader.BeginLoad_OnUIThread(AsyncCallback userCallback, PageResourceContentLoaderAsyncResult result)
   at System.Windows.Navigation.PageResourceContentLoader.<>c__DisplayClass4.<BeginLoad>b__0(Object args)
   at System.Reflection.RuntimeMethodInfo.InternalInvoke(RuntimeMethodInfo rtmi, Object obj, BindingFlags invokeAttr, Binder binder, Object parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess, StackCrawlMark& stackMark)
   at System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, StackCrawlMark& stackMark)
   at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
   at System.Delegate.DynamicInvokeOne(Object[] args)
   at System.MulticastDelegate.DynamicInvokeImpl(Object[] args)
   at System.Delegate.DynamicInvoke(Object[] args)
   at System.Windows.Threading.DispatcherOperation.Invoke()
   at System.Windows.Threading.Dispatcher.Dispatch(DispatcherPriority priority)
   at System.Windows.Threading.Dispatcher.OnInvoke(Object context)
   at System.Windows.Hosting.CallbackCookie.Invoke(Object[] args)
   at System.Windows.Hosting.DelegateWrapper.InternalInvoke(Object[] args)
   at System.Windows.RuntimeHost.ManagedHost.InvokeDelegate(IntPtr pHandle, Int32 nParamCount, ScriptParam[] pParams, ScriptParam& pResult)
在BattleSimulator.GamePage..ctor()上
在System.Reflection.RuntimeConstructorInfo.InternalInvoke(RuntimeConstructorInfo rtci、BindingFlags invokeAttr、Binder Binder、对象参数、CultureInfo区域性、Boolean isBinderDefault、程序集调用者、Boolean verifyAccess、StackScrawMark和stackMark)
在System.Reflection.RuntimeConstructorInfo.InternalInvoke(对象obj、BindingFlags invokeAttr、绑定器绑定器、对象[]参数、CultureInfo区域性、堆栈爬网标记和堆栈标记)
位于System.Activator.InternalCreateInstance(类型类型、布尔非公共、StackScrawlMark和stackMark)
位于System.Activator.CreateInstance(类型)
在System.Windows.Navigation.PageResourceContentLoader.BeginLoad\u OniThread(异步回调用户回调,PageResourceContentLoaderAsyncResult结果)
在System.Windows.Navigation.PageResourceContentLoader.c__DisplayClass4.b__0(对象参数)中
在System.Reflection.RuntimeMethodInfo.InternalInvoke(RuntimeMethodInfo rtmi、对象obj、BindingFlags invokeAttr、绑定器绑定器、对象参数、CultureInfo区域性、布尔值isBinderDefault、程序集调用者、布尔值验证访问、堆栈爬网标记和堆栈标记)
位于System.Reflection.RuntimeMethodInfo.InternalInvoke(对象obj、BindingFlags invokeAttr、绑定绑定器、对象[]参数、CultureInfo区域性、StackScrawMark和stackMark)
在System.Reflection.MethodBase.Invoke(对象obj,对象[]参数)处
位于System.Delegate.DynamicInvokeOne(对象[]args)
位于System.MulticastDelegate.DynamicInvokeImpl(对象[]args)
位于System.Delegate.DynamicInvoke(对象[]args)
在System.Windows.Threading.DispatcherOperation.Invoke()中
在System.Windows.Threading.Dispatcher.Dispatch中(DispatcherPriority优先级)
位于System.Windows.Threading.Dispatcher.OnInvoke(对象上下文)
位于System.Windows.Hosting.CallbackCookie.Invoke(对象[]args)
位于System.Windows.Hosting.DelegateWrapper.InternalInvoke(对象[]args)
位于System.Windows.RuntimeHost.ManagedHost.InvokeDelegate(IntPtr pHandle、Int32 nParamCount、ScriptParam[]pParams、ScriptParam&pResult)
解决这一问题的一种方法是将我所有的silverlight类和标记复制到一个新的SL和XNA项目中,但这是我的计划,如果其他方法都失败了

有人知道如何解决此NullReferenceException或警告吗?或者我应该试着用其他方式来做

编辑:在此处找到有关警告的信息:
它是无害的。

空引用最有可能是
as
运算符未能将类型转换为
应用程序
,当您尝试在
as
的结果中查找
内容
属性时,这将导致空引用异常

对于SL/XNA项目,在应用程序全局级别上定义了两个额外的东西,以及
应用程序
对象中的一些额外样板代码。这些是特定于SL/XNA的,不是为纯SL项目定义的。对于SL/XNA项目,还需要对XNA类库进行一些额外的项目引用

如果仔细研究标准SL和SL/XNA基本应用程序项目之间的差异,可以将此额外代码手动添加到现有SL项目中,但在您的情况下,创建新的SL/XNA项目并将代码移到其中可能更容易

例如,一些添加项是(这不包括额外的样板代码,所以请自己检查)

从App.xaml:

<!--The SharedGraphicsDeviceManager is used to render with the XNA Graphics APIs-->
<xna:SharedGraphicsDeviceManager />

从App.xaml.cs:

    /// <summary>
    /// Provides access to a ContentManager for the application.
    /// </summary>
    public ContentManager Content { get; private set; }

    /// <summary>
    /// Provides access to a GameTimer that is set up to pump the FrameworkDispatcher.
    /// </summary>
    public GameTimer FrameworkDispatcherTimer { get; private set; }

    /// <summary>
    /// Provides access to the AppServiceProvider for the application.
    /// </summary>
    public AppServiceProvider Services { get; private set; }
//
///提供对应用程序的ContentManager的访问。
/// 
公共ContentManager内容{get;private set;}
/// 
///提供对设置为启动FrameworkDispatcher的游戏计时器的访问。
/// 
公共游戏计时器FrameworkDispatchTimer{get;private set;}
/// 
///提供对应用程序的AppServiceProvider的访问。
/// 
公共AppServiceProvider服务{get;private set;}

谢谢您的回答。我开始研究它,但它似乎有点麻烦,我认为风险是我最终会得到一些不稳定的东西。我会拿着我的鼠标开始导入。