2010-03-22 6 views
0

J'ai un problème avec un service Windows qui lance une exception NullReference chaque fois que j'essaie d'utiliserActivator.CreateInstance échoue dans Windows Services

var myType = Activator.CreateInstance(typeof(MyType)) 

Il n'y a pas de problème à chaque fois que je lance le même code dans une fenêtre de console - et après le débogage de l'évident "quel utilisateur exécute ce code" je doute que c'est un simple fait de changer l'utilisateur qui exécute le service car j'ai essayé d'exécuter le service en utilisant le compte administrateur de l'ordinateur ainsi que LocalSystem. Je soupçonne une mise à jour Windows avec les droits d'utilisateur par défaut, mais c'est un peu désespérée que je ressens. Rappelez-vous: Le type et l'assemblage existent et fonctionnent bien - sinon je ne serais pas capable d'exécuter le code dans une fenêtre de console. Ce n'est qu'en courant dans le contexte d'un service Windows que j'obtiens une erreur. La question est la suivante: Puis-je en aucun cas usurper l'identité de LocalSystem dans un unittest en créant un GenericPrincipal (à quoi ressemblerait GenericPrincipal)?

+0

Il doit être quelque chose d'autre, j'utilise cet appel dans les services Windows tout le temps. – kenny

+0

Alors pouvons-nous donc je ne vraiment pas non plus: o/ – kerbou

Répondre

0

Je sais que c'est une réponse simple, mais avez-vous essayé de le mettre dans un bloc try catch puis d'écrire l'exception pour voir si elle est basée sur les autorisations ou autrement.

+0

Oui - le stacktrace est ici: cb System.RuntimeTypeHandle.CreateInstance (type RuntimeType, Boolean publicOnly, Boolean nocheck, Boolean & canBeCached, RuntimeMethodHandle & cteur, Boolean & bNeedSecurityCheck) Ved System.RuntimeType.CreateInstanceSlow (Boolean publicOnly, Boolean FillCache) ved System.RuntimeType.CreateInstanceImpl (Boolean publicOnly, skipVisibilityChecks booléennes, Boolean FillCache) ved System.Activator.CreateInstance (type de type, booléen non publique) système ved . Activator.CreateInstance (Type de type) ved dgiCore.Data.Logic.EmailDataService..cctor() [snip] – kerbou

+0

Ecrivez la valeur de chacun de ces paramètres avant l'appel à voir si aucun n'est nul. Vous pouvez également lancer une exception si elles sont nulles mais avec un message spécifique que vous pouvez comprendre. – Chris

1

Vous pouvez toujours exécuter une instance de studio visuel en tant que LocalSystem. A partir de la ligne de commande, entrez les informations suivantes:

at <time in near future> /interactive <path to devenv.exe> 

puis attendez que le temps de rouler autour et VS devrait ouvrir, mais sera en cours d'exécution sous le compte LocalSystem.

Personnellement, je ne soupçonnerais pas le compte d'utilisateur, et je soupçonne plutôt que cela a quelque chose à voir avec être interactif - le constructeur ou le constructeur de classe pour MyType a-t-il une dépendance implicite sur le bureau? (Editer - oups, devrait être temps avant/interactive, ligne de commande corrigée).

par exemple.

at 11:48 /interactive "c:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\devenv.exe" 
+0

La dépendance implicite peut être une bonne idée – Seb