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 に配置して今のところ呼び出して、タイル情報の生成と実装をテストし、それが機能するかどうかを確認し、呼び出しているコードが正常に機能するかどうかを確認しました。アプリを開くと、タイルが更新されます。次に、バックグラウンド タスクを機能させる必要があります。

誰でも提供できるヘルプは大歓迎です。もう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 にネイティブ]

また、低メモリ エミュレータを使用していて、低メモリ デバイスではバックグラウンド エージェントが許可されていないことを忘れていたと考えられますが、どのエミュレータ (またはデバイス) を使用しても違いはありません。

4

3 に答える 3

4

この間ずっとそれと戦った後、私は問題を解決しました。あるプロジェクトから別のプロジェクトにコードをコピーする際に、メインプロジェクトのScheduledTaskプロジェクトへの参照を追加するのを忘れました。

また、サンプルコードをプロジェクト外で機能させるために作業する過程で、他にもいくつかのことを学びました。まず、ScheduledTaskプロジェクトを追加すると、必要なメタデータがWMAppManifest.xmlファイルに追加されていないように見えるため、手動で追加する必要があります。もう1つは、バックグラウンドエージェントを処理する場合、エラーメッセージはかなりわかりにくい可能性があり、問題が実際に何であるかについては何も言わない可能性があるということです。

これから、スケジュールされたタスクで作業しているときに、ここで見たようなエラーが表示された場合(いくつかのかなり不可解なエラーが表示されましたが、すべて同じように見えますが、完全ではありません)、それは私が確認するためのプロンプトになります。 2番目のプロジェクトへの参照を取得し、必要な情報が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.dlls は NGENed .net dlls です。フレームワークは NGENed されて電話に展開されるため、表示されるほとんどの例外は *.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 に答える