2010-12-11 4 views
2

J'ai besoin de vos conseils pour le code C#:composant COM fonctionne à 100% à partir d'une application de la console, mais échoue lorsqu'il est appelé d'un service

EgarDDSEnt.IIVDDSEnt dds = null; // This line executes fine. 
dds = new IVDDSEnt(); // This line fails with an exception ... 
dds.Connect("username", "password"); // ... which makes this line fail too. 

Voici les symptômes:

Windows Server 2008 R1 :

  • Le code échoue lorsqu'il est exécuté à partir d'une application de service Windows.
  • Le code fonctionne à 100% lorsqu'il est exécuté à partir d'une application de console.

Windows 7:

  • code fonctionne à 100% lorsqu'il est exécuté à partir d'une application de service Windows.
  • Le code fonctionne à 100% lorsqu'il est exécuté à partir d'une application de console.

La classe IVDDSEnt() est un objet COM installé sur lequel vous installez le "SDK ivolatility".

Mise à jour:

  • Lorsque j'exécute de l'application de la console "System.IO.Directory.GetCurrentDirectory()", il retourne "D: \ MyDevDirectory \"
  • Quand j'execute « système .IO.Directory.GetCurrentDirectory() "de l'application de service, il renvoie" C: \ windows \ system32 \ ".
  • L'application est en fait le même binaire pour le service et la console (c'est une application hybride qui peut fonctionner en mode console, ou s'installer en tant que service si vous lui passez "service" sur la ligne de commande).

Mise à jour:

Ajouté try/catch et "e.GetBaseException" (défini comme "Renvoie l'exception qui est la cause première d'une ou plusieurs exceptions suivantes"):

System.Runtime.InteropServices.COMException (0x80080005): Retrieving 
the COM class factory for component with CLSID 
{FA944FE7-AEB8-4B5B-8315-11D19B1F6264} failed due to the following error: 
80080005 Server execution failed (Exception from HRESULT: 
0x80080005 (CO_E_SERVER_EXEC_FAILURE)). 
at PhiDataOnSchedule.ConsoleApplication.MyMain(Boolean dummyRun) 

Mise à jour:

peut toujours pas résoudre le problème - la méthode la plus simple de mettre à niveau juste de Serv de Windows 2008 R1 à Windows Server 2008 R2 (si cela fonctionne sur Win7, et Windows Server 2008 R2 a un noyau Win7, peut-être que ça va contourner le problème sous-jacent?).

+2

« échoue avec une exception » vous pensez qu'il serait utile de nous dire ce que ** ** exception? –

+0

Certainement besoin de la décharge d'exception ou nous n'allons nulle part. – Squirrelsama

+0

L'exception ne semble pas très utile: 'MyHelper.LogThis.OnException: Exception "NullReferenceException": "Référence d'objet non définie sur une instance d'un objet."'. Y a-t-il un moyen d'obtenir une décharge d'exception plus complète? – Contango

Répondre

0

Peut-être que je dois spécifier un compte pour exécuter le service sous?

Pour un exemple complet de la façon de coder ça, voir:

http://www.codeproject.com/KB/WPF/LtoE.aspx?artkw=LINQ%20to%20WCF#ShowIt

Rechercher le texte: « Lorsque le programme d'installation est exécuté, il vous permettra d'entrer les informations de connexion de service pour exécuter sous, en utilisant la boîte de dialogue suivante ":

alt text

4

C'est probablement un problème de droits. Vérifiez sous quel compte de service le service s'exécute et ses droits. Ensuite, modifiez le compte de service ou développez ses droits.

+0

Essayé cela, pas de chance. J'ai essayé de cocher "Autoriser le service à interagir avec le bureau". J'ai essayé de définir le login du service comme étant "Administrator/Mypassword". J'ai essayé d'éteindre l'UAC. J'ai également essayé "oleview" pour définir les autorisations pour les objets COM à exécuter par le "Administrateur". D'autres idées? – Contango

+0

@Gravitas: si le serveur COM est hors processus, vous devrez peut-être le configurer pour qu'il soit accessible. Jetez un oeil ici: http://msdn.microsoft.com/en-us/library/ms690141(v=vs.85).aspx –

1

CO_E_SERVER_EXEC_FAILURE est "L'exécution du serveur a échoué". Cela indiquerait que le composant doit être hors processus, mais l'exécution COM n'a pas pu démarrer l'exécutable (ou, peut-être, charger la DLL dans un processus hôte).Recherche d'activité contre le fichier contenant le composant avec Process Monitor peut vous donner un indice (il pourrait être des autorisations: Process Monitor pourrait le confirmer).

+0

Cheers, je vais essayer ce matin. C'est l'un de ces problèmes ennuyeux: il fonctionne à 100% comme un service sur ma machine de développement, au bureau, mais se brise quand il est déployé sur le serveur distant Amazon EC2. – Contango

Questions connexes