7 votes

Qu'est-ce que System.Windows.ni.dll ?

Je travaille sur une application WP8 qui utilise un ScheduledTaskAgent pour mettre à jour une Live Tile. C'est une application assez simple, en fait. Le problème est que, bien que j'aie copié directement le code du projet WP7 vers le projet WP8, il ne lance pas la ScheduledTask. Non seulement cela, mais j'obtiens une erreur si je suis en train de déboguer et que j'essaie de lancer la tâche planifiée pour tester.

Une 'System.InvalidOperationException' s'est produite dans System.Windows.ni.dll

Non seulement cela, mais il ne me donne aucune pile à regarder, et dit que la source n'est pas disponible, que je peux regarder le désassemblage dans la fenêtre de désassemblage, ce qui ne veut rien dire pour moi. Ce n'est donc pas une erreur très utile, IMO.

J'ai essayé de mettre un point d'arrêt dans le constructeur de la tâche planifiée, mais il n'y arrive jamais. Si je commente le lancement pour le test, il n'y a pas d'erreur. Mais bien sûr, en mettant l'application dans mon téléphone, elle ne s'est jamais lancée, et je l'ai laissée toute la nuit.

Voici mon code :

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
            }

Le code fonctionne bien dans la version WP7 :/

Ceci se trouve dans mon fichier WMAppManifest.xml :

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

Dans ma tâche planifiée, la seule chose que je fais est d'appeler une procédure qui génère les informations de la tuile, mettant à jour la tuile, et pour le moment, je ré-exécute le lancement pour le test, de sorte que je puisse regarder si elle se met à jour à nouveau, bien que j'ai eu cela commenté - je l'ai décommenté pour le coller ici, mais cela a été commenté. Voici ma méthode OnInvoke :

    GenerateTileInfo();

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

    NotifyComplete();

La méthode GenerateInfo ne fait rien qui puisse causer un problème, mais bien sûr, elle n'y arrivera jamais de toute façon. J'ai testé la génération des informations sur les tuiles et leur mise en œuvre en plaçant ce code dans MainPage.xaml.cs et en l'appelant pour l'instant, afin de voir si cela fonctionnait, et le code que j'appelle fonctionne correctement. Donc si j'ouvre l'application, la tuile est mise à jour. Maintenant, je dois faire fonctionner la tâche d'arrière-plan.

Toute aide est la bienvenue. Un autre indice est qu'hier soir, j'ai obtenu une erreur qui impliquait de ne pas pouvoir localiser un fichier pdb - je pense que c'était Microsoft.Phone.pdb, mais quoi qu'il en soit, il faisait également référence au fichier System.Windows.ni.dll, mais maintenant je n'obtiens pas ce problème pdb, juste cette InvalidOperationException. Hier soir, les symboles de débogage (je ne sais pas ce que cela signifie) ne se chargeaient pas. Aujourd'hui, ils le sont. Je ne sais pas ce que j'ai fait pour résoudre ce problème. Cela aurait pu être un redémarrage, pour ce que j'en sais.

J'ai également essayé de créer un nouveau projet et de copier mon code dans un nouveau projet, pensant que j'avais peut-être un fichier de projet corrompu, mais l'erreur que j'obtiens maintenant est la même que celle que j'ai obtenue plus tôt dans la journée et qui m'a incité à créer un nouveau projet.

Encore une fois, toute aide est la bienvenue. Merci d'avance.

(Edit - Nouveaux commentaires ajoutés en dessous de ce point 12/29 à 11:34 am EST) =================================================================================

J'ai tenté une autre expérience. J'ai créé un nouveau projet et j'ai copié/collé le code de http://www.jeffblankenburg.com/2011/11/25/31-days-of-mango-day-25-background-agents/ pour voir si je pouvais déboguer l'application. J'ai dû apporter quelques modifications mineures au code écrit par Jeff Blankenburg, car il indique que lorsque vous ajoutez le projet de tâches planifiées, le code suivant est automatiquement ajouté au fichier WMAppManifest.xml, ce qui n'est pas le cas. Je l'ai fait manuellement.

J'ai également modifié le StandardTileData type à FlipTileData (puisque c'est ce qui était par défaut dans le projet WP8) dans le code qui est collé dans le ScheduledAgent.cs.

A part cela, la seule chose que j'ai faite et que Jeff ne mentionne pas dans son article est d'ajouter les directives using nécessaires.

Au vu des résultats de cette expérience, je pense que mon installation de Visual Studio est peut-être corrompue. Êtes-vous d'accord ? Je pense qu'il faut désinstaller/réinstaller VS2012 et le sdk du téléphone, mais comme cela prend beaucoup de temps, je voulais avoir un autre avis. Je vous remercie.

Mise à jour (1/4/2012) ===============================================================

J'ai désinstallé VS, parcouru le registre, puis réinstallé VS2012 et le SDK pour téléphone. Voici ce que j'obtiens maintenant - au moins maintenant il me montre la trace de la pile :

[Native to Managed Transition] (en anglais) System.Windows.ni.dll!MS.Internal.JoltHelper.OnUnhandledException(object sender, System.UnhandledExceptionEventArgs args) [Transition managée à native] 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(object state) 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 callback, object state) mscorlib.ni.dll!System.Threading.ThreadHelper.ThreadStart() [Native to Managed Transition]

J'ai également tenu compte du fait que j'utilisais un émulateur à faible mémoire et que j'avais oublié que les agents d'arrière-plan ne sont pas autorisés dans les appareils à faible mémoire, mais l'émulateur (ou l'appareil) que j'utilise ne fait aucune différence.

2voto

JustinAngel Points 13219

Oui, il n'y a aucune chance que cet extrait de code fonctionne avec le SDK WP7.5. task.ToString() sera le nom du type (" Microsoft.Phone.Scheduler.PeriodicTask ") et n'est donc pas la bonne valeur.

Changement :

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

A :

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

Et cela fonctionne bien.

Pour répondre à votre question : Les dlls *.ni.dlls sont des dlls .net NGENed. Le framework est NGENed et déployé sur le téléphone, donc la plupart des exceptions que vous verrez viendront des dlls *.ni frameworks. Je suppose que vous venez de voir une exception générique.

1voto

Peter Points 669

Comment cela se passe-t-il ? J'ai un problème très similaire ('System.InvalidOperationException' occurred in System.Windows.ni.dll') lorsque j'entre dans le code de l'agent d'arrière-plan... il fonctionnait bien dans WP7... l'application est toujours WP7 sauf que maintenant je fonctionne sous VS2012 et que j'ai installé le SDK WP8.

Ce qui est amusant, c'est que j'ai une autre application qui fonctionne parfaitement - exactement le même scénario et le même environnement.

Avez-vous résolu votre problème ? C'est très frustrant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X