什么是System.Windows.ni.dll?

时间:2012-12-29 01:14:45

标签: visual-studio-2012 windows-phone windows-phone-8

我正在使用一个使用ScheduledTaskAgent更新Live Tile的WP8应用程序。这真是一个非常简单的应用程序。问题是,虽然我直接将代码从WP7项目复制到WP8项目,但它不会启动ScheduledTask。不仅如此,如果我正在调试并且尝试启动计划任务进行测试,则会出现错误。

  

' System.InvalidOperationException'发生在System.Windows.ni.dll

不仅如此,它还没有给我任何堆栈来查看,并且说源不可用,我可以在反汇编窗口查看反汇编,这对我来说没什么意义。所以,这不是一个非常有用的错误,IMO。

我尝试在计划任务的构造函数中放置一个断点,它永远不会在那里。如果我注释掉测试的启动,没有错误。但是,当然,将应用程序放在我的手机中,它从未启动,让它一夜之间。

这是我的代码:

var taskName = "TileUpdater";
            var oldTask = ScheduledActionService.Find(taskName) as PeriodicTask;
            if (oldTask != null)
            {
                ScheduledActionService.Remove(taskName);
            }
            if (useLiveTile)
            {
                //GenerateTileInfo();
                PeriodicTask task = new PeriodicTask(taskName);
                task.Description = AppResources.BackgroundTaskDescription;
                oldTask = ScheduledActionService.Find(taskName) as PeriodicTask;
                if (oldTask == null)
                {
                    ScheduledActionService.Add(task);
                }
#if DEBUG
                ScheduledActionService.LaunchForTest(taskName, TimeSpan.FromSeconds(10));
#endif
            }

代码在WP7版本中运行良好。 :/

这是在我的WMAppManifest.xml文件中:

    <ExtendedTask Name="BackgroundTask">
        <BackgroundServiceAgent Specifier="ScheduledTaskAgent"
                                Name="xxxScheduledTask"
                                Source="xxxScheduledTask"
                                Type="xxxScheduledTask.SecheduledAgent" />
    </ExtendedTask>

在我计划的任务中,我唯一要做的就是调用一个生成磁贴信息的过程,更新磁贴,暂时我重新运行启动测试,所以我可以看一下它是否会再次更新,虽然我已将此注释掉 - 我将其取消注释以粘贴到此处,但这已被注释掉了。这是我的OnInvoke方法:

    GenerateTileInfo();

    #if DEBUG
        ScheduledActionService.LaunchForTest(task.ToString(), TimeSpan.FromSeconds(60));
    #endif

    NotifyComplete();

GenerateInfo方法不会做任何会导致问题的事情,但当然,它永远不会到达那里。我测试了我生成的tile信息并实现它,将该代码放在MainPage.xaml.cs中并立即调用它,看它是否有效,并且我调用的代码工作正常。因此,如果我打开应用程序,则会更新磁贴。现在我需要让后台任务工作。

非常感谢任何人提供的任何帮助。另一个线索是,昨晚我收到一个错误,涉及无法找到pdb文件 - 我认为它是Microsoft.Phone.pdb,但不管它是什么,它也提到了System.Windows.ni.dll文件,但现在我没有得到pdb问题,只是这个InvalidOperationException。昨晚调试符号(我不知道这意味着什么)没有加载。今天他们是。我不知道我做了什么来解决它。对于我所知道的一切,本可以重启一下。

另外,我尝试创建一个新项目并将我的代码复制到一个新项目,以为我可能有一个损坏的项目文件,但我现在得到的错误与我今天早些时候提到的错误相同我要创建新项目。

再次,任何帮助表示赞赏。感谢。

(编辑 - 美国东部时间上午11点34分在此点12/29以下添加的新评论) ================================================== ===============================

我尝试了另一次尝试。我创建了一个新项目,并从http://www.jeffblankenburg.com/2011/11/25/31-days-of-mango-day-25-background-agents/复制/粘贴代码,看看我是否可以调试应用程序。我确实必须对Jeff Blankenburg编写的代码进行一些小的更改,因为他声明当你添加计划任务项目时,它会自动将以下代码添加到WMAppManifest.xml文件中,它没有做到这一点。 。我是手动完成的。

         

我还在粘贴到ScheduledAgent.cs的代码中将 StandardTileData 类型更改为 FlipTileData (因为这是WP8项目中的默认值)。< / p>

除此之外,杰夫在他的文章中没有提到的唯一一件事就是添加必要的使用指令。

鉴于此实验的结果,我想我可能会以某种方式查看我的Visual Studio安装已损坏。你同意吗?我认为卸载/重新安装VS2012和手机sdk就是这里的顺序,但由于需要很长时间,我想得到另一种意见。感谢。

更新(1/4/2012) ================================================== =============

卸载VS,通过注册表,然后重新安装VS2012,并手机SDK。这就是我现在得到的 - 至少现在它会显示堆栈跟踪:

[原生于管理过渡] System.Windows.ni.dll!MS.Internal.JoltHelper.OnUnhandledException(object sender,System.UnhandledExceptionEventArgs args) [管理到原生过渡] mscorlib.ni.dll!System.Reflection.RuntimeAssembly.nLoad(System.Reflection.AssemblyName fileName,string codeBase,System.Security.Policy.Evidence assemblySecurity,System.Reflection.RuntimeAssembly locationHint,ref System.Threading.StackCrawlMark stackMark,System。 IntPtr pPrivHostBinder,bool throwOnFileNotFound,bool forIntrospection,bool suppressSecurityChecks) mscorlib.ni.dll!System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(System.Reflection.AssemblyName assemblyRef,System.Security.Policy.Evidence assemblySecurity,System.Reflection.RuntimeAssembly reqAssembly,ref System.Threading.StackCrawlMark stackMark,System.IntPtr pPrivHostBinder, bool throwOnFileNotFound,bool forIntrospection,bool suppressSecurityChecks) mscorlib.ni.dll!System.Reflection.RuntimeAssembly.InternalLoad(string assemblyString,System.Security.Policy.Evidence assemblySecurity,ref System.Threading.StackCrawlMark stackMark,System.IntPtr pPrivHostBinder,bool forIntrospection) mscorlib.ni.dll!System.Reflection.RuntimeAssembly.InternalLoad(string assemblyString,System.Security.Policy.Evidence assemblySecurity,ref System.Threading.StackCrawlMark stackMark,bool forIntrospection) mscorlib.ni.dll!System.Reflection.Assembly.Load(string assemblyString) Microsoft.Phone.ni.dll!Microsoft.Phone.BackgroundAgentActivator.LoadEntryPointAssembly(string assemblyName) Microsoft.Phone.ni.dll!Microsoft.Phone.BackgroundAgentActivator.LoadAgent(string assemblyName,string typeName) Microsoft.Phone.ni.dll!Microsoft.Phone.BackgroundAgentActivator.Microsoft.Phone.IBackgroundAgentActivator.CreateBackgroundAgent(string assembly,string typeinfo) Microsoft.Phone.ni.dll!Microsoft.Phone.BackgroundAgentDispatcher.AgentRequest.Invoke() Microsoft.Phone.ni.dll!Microsoft.Phone.BackgroundAgentDispatcher.InvocationThread() mscorlib.ni.dll!System.Threading.ThreadHelper.ThreadStart_Context(对象状态) mscorlib.ni.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext,System.Threading.ContextCallback callback,object state,bool preserveSyncCtx) mscorlib.ni.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext,System.Threading.ContextCallback callback,object state,bool preserveSyncCtx) mscorlib.ni.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext,System.Threading.ContextCallback回调,对象状态) mscorlib.ni.dll!System.Threading.ThreadHelper.ThreadStart() [原生于管理过渡]

还考虑到我使用的是低内存模拟器,并且忘记了低内存设备中不允许使用后台代理,但我使用的模拟器(或设备)没有区别。

3 个答案:

答案 0 :(得分:4)

经过这段时间的战斗,我已经解决了问题。在将代码从一个项目复制到另一个项目时,我忘了在主项目中添加对ScheduledTask项目的引用。

我在处理示例代码的过程中还学到了其他一些东西,试图让它在我的项目之外工作。首先,当您添加ScheduledTask项目时,它似乎没有将必要的元数据添加到WMAppManifest.xml文件,因此您需要手动添加它。另一件事是,在处理后台代理时,错误消息可能非常神秘,并且可能没有说明问题究竟是什么。

从现在开始,当我看到一个像我在这里看到的错误(我看到几个非常神秘的错误,所有看起来都相同但不完全)在处理计划任务时,这将是一个提示我确实已经引用了第二个项目,并确保必要的信息在WMAppManifext.xml中(包括拼写 - 如果拼错它,它将不会加下划线)。

答案 1 :(得分:2)

是的,这段代码片段无法在WP7.5 SDK上运行。 task.ToString()将是类型名称(“Microsoft.Phone.Scheduler.PeriodicTask”),因此不是正确的值。

更改:

ScheduledActionService.LaunchForTest(task.ToString(), TimeSpan.FromSeconds(60));

致:

ScheduledActionService.LaunchForTest(task.Name, TimeSpan.FromSeconds(60));

它工作正常。

回答你的问题:* .ni.dlls是NGENed .net dlls。该框架获得NGENed并部署到手机上,因此您将看到的大多数例外都来自* .ni frameworks dlls。我猜你刚看到一个普通的异常。

答案 2 :(得分:1)

你是如何继续这样做的?我有一个非常类似的问题(System.Windows.ni.dll中出现'System.InvalidOperationException'当我进入后台代理程序代码...它在WP7中工作正常...应用程序仍然是WP7,除了现在我在VS2012下运行并安装了WP8 SDK。

有趣的是,我有另一个可以正常工作的应用程序 - 完全相同的场景和环境。

您的问题是否排序了吗?这非常令人沮丧。