7

我正在开发一个使用 ScheduledTaskAgent 更新动态磁贴的 WP8 应用程序。这是一个非常简单的应用程序,真的。问题是当我直接将代码从 WP7 项目复制到 WP8 项目时,它不会启动 ScheduledTask。不仅如此,如果我正在调试并尝试启动计划任务进行测试,我会收到错误消息。

System.Windows.ni.dll 中发生“System.InvalidOperationException”

不仅如此,它并没有给我任何堆栈查看,并说源不可用,我可以在反汇编窗口中查看反汇编,这对我来说没有任何意义。所以,这不是一个非常有用的错误,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 方法不会做任何会导致问题的事情,但当然,无论如何它永远不会到达那里。我确实测试了我生成的磁贴信息,并通过将该代码放在 MainPage.xaml.cs 中并暂时调用它来实现它,以查看它是否有效,并且我正在调用的代码工作正常。因此,如果我打开应用程序,磁贴就会更新。现在我需要让后台任务工作。

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

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

再次感谢任何帮助。谢谢。

(编辑 - 美国东部时间 12 月 29 日上午 11:34 在此点下方添加了新评论)=============================== ====================================================

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

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

除此之外,Jeff 在他的文章中没有提到的唯一一件事是添加必要的 using 指令。

鉴于这个实验的结果,我想我可能会以某种方式查看我的 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 文件名,字符串 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。加载(字符串 assemblyString)Microsoft.Phone.ni.dll!Microsoft.Phone.BackgroundAgentActivator.LoadEntryPointAssembly(字符串 assemblyName)Microsoft.Phone.ni.dll!Microsoft.Phone.BackgroundAgentActivator.LoadAgent(字符串 assemblyName,字符串 typeName)Microsoft.Phone。 ni.dll!Microsoft.Phone。BackgroundAgentActivator.Microsoft.Phone.IBackgroundAgentActivator.CreateBackgroundAgent(字符串程序集,字符串类型信息) 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 回调,对象状态, 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() [原生到托管转换]

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

4

3 回答 3

4

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

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

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

于 2013-01-14T10:54:12.763 回答
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.dll 是 NGENed .net dll。该框架获得了 NGEN 并部署到手机,因此您将看到的大多数异常都来自 *.ni 框架 dll。我猜你刚刚看到了一个通用的异常。

于 2012-12-29T01:56:58.350 回答
1

你的进展如何?当我进入后台代理代码时,我遇到了一个非常相似的问题(System.Windows.ni.dll 中发生了“System.InvalidOperationException”……它在 WP7 中运行良好……除了现在,该应用程序仍然是 WP7我在 VS2012 下运行并安装了 WP8 SDK。

有趣的是,我有另一个运行良好的应用程序 - 完全相同的场景和环境。

你的问题解决了吗?这非常令人沮丧。

于 2013-01-01T04:45:04.067 回答