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 に配置して今のところ呼び出して、タイル情報の生成と実装をテストし、それが機能するかどうかを確認し、呼び出しているコードが正常に機能するかどうかを確認しました。アプリを開くと、タイルが更新されます。次に、バックグラウンド タスクを機能させる必要があります。
誰でも提供できるヘルプは大歓迎です。もう1つの手がかりは、昨夜、pdbファイルが見つからないというエラーが発生したことです.Microsoft.Phone.pdbだったと思いますが、それが何であれ、System.Windows.ni.dllも参照していました.ファイルですが、今はその pdb の問題は発生していません。この InvalidOperationException だけです。昨夜、デバッグ シンボル (それが何を意味するのかわかりません) が読み込まれませんでした。今日、彼らはそうです。私はそれを修正するために何をしたかわかりません。私が知っている限りでは、再起動された可能性があります。
また、プロジェクト ファイルが破損している可能性があると考えて、新しいプロジェクトを作成し、コードを新しいプロジェクトにコピーしようとしましたが、現在発生しているエラーは、今日以前に発生していたエラーと同じで、新しいプロジェクトを作成するよう促されました。事業。
繰り返しますが、どんな助けでも大歓迎です。ありがとう。
(編集 - 12/29 午前 11:34 EST にこの時点の下に新しいコメントが追加されました) ============================== ==================================================
別の実験を試みました。新しいプロジェクトを作成し、 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とphone sdkのアンインストール/再インストールでいいと思っているのですが、時間がかかるので別の意見をいただきたいです。ありがとう。
更新 (2012 年 1 月 4 日) ========================================= =====================
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、文字列 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 (文字列アセンブリ、文字列 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 コールバック, オブジェクト状態, bool preserveSyncCtx) mscorlib.ni.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext、System.Threading.ContextCallback コールバック、オブジェクト状態、bool preserveSyncCtx) mscorlib.ni.dll!System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext 実行コンテキスト、System.Threading.ContextCallback コールバック、オブジェクトの状態) mscorlib.ni.dll!System.Threading.ThreadHelper.ThreadStart() [Managed Transition にネイティブ]
また、低メモリ エミュレータを使用していて、低メモリ デバイスではバックグラウンド エージェントが許可されていないことを忘れていたと考えられますが、どのエミュレータ (またはデバイス) を使用しても違いはありません。