2008-10-02 13 views
33

Nous avons une grande application C# (.net 2.0) qui utilise notre propre composant COM C++ et une bibliothèque de scanner d'empreintes digitales 3ème partie également accessible via COM. Nous avons rencontré un problème où, en production, certains événements de la bibliothèque d'empreintes digitales ne sont pas déclenchés dans l'application C#, bien que les événements de notre propre composant COM C++ aient été déclenchés et aient été reçus correctement. En utilisant MSINFO32 pour comparer les modules chargés sur un système de travail à ceux d'un système défaillant, nous avons déterminé que cela était dû au fait que STDOLE.DLL ne se trouvait pas dans le GAC et n'était donc pas chargé dans le processus défectueux. Le fait de faire glisser ce fichier dans le GAC a provoqué le retour des événements de la bibliothèque COM d'empreintes digitales.Que fait stdole.dll?

Alors, que fait stdole.dll? Il a une taille de 16k donc ça ne peut pas être beaucoup ... est-ce une sorte de lien vers une autre bibliothèque comme STDOLE32? Comment se fait-il que son absence provoque un comportement si étrange?

Comment distribuons-nous stdole.dll? Ceci est une application de déploiement XCOPY et nous n'utilisons pas le GAC. Devrions-nous l'empaqueter comme une ressource et utiliser le System.EnterpriseServices.Internal.Publish.GacInstall pour nous assurer qu'il est dans le GAC?

Répondre

20

Il semble que stdole.dll soit un assembly interop primaire. Voir Office 2003 Primary Interop Assemblies on MSDN.

+0

Oui, je trouve une copie dans le répertoire PIA ainsi.Notre application n'utilise pas de composants de bureau; et cela n'explique toujours pas le comportement que nous voyons! –

+2

Il peut utiliser une interface COM "standard" comme IFont ou IDispatch. Semble le support de ces interfaces dans. NET besoin de ref stdole.dll. Je suis confus pourquoi diable cette assemblée est liée à Office. – Aardvark

0

Je devais aussi ajouter une référence à mon projet de stdole. Même si je n'ai aucune référence (c'est une simple application d'image), 2 de nos utilisateurs recevaient des erreurs qui manquaient. Il se pourrait qu'ils n'exécutent que .net 2.0 lorsqu'il s'agit d'une application 3.5. J'ai compris pourquoi.

Je suis également allé publier sur l'onglet Propriétés du projet, et les fichiers d'application sélectionnés, puis inclus la stdole à déployer. J'espère que cela fonctionnera.

+2

Cela peut fonctionner, mais stdole.dll n'est pas un fichier redistribuable et pourrait casser des installations existantes en fonction de cela ... (recherche de stdole) http://msdn.microsoft.com/en-us/library/aa195478(office. 11) .aspx –

1

J'ai eu le même problème. Je viens de supprimer la référence de l'application et recompilé. Ran tous les tests qui ont passé. Puis redéployé sans la DLL et tout a fonctionné.

Je ne sais pas comment une référence à cela a été dans le projet en premier lieu. C'est une application héritée qui doit donc avoir été il y a longtemps.

Simon

0

Dans notre projet IDispatch couses en utilisant stdole.dll. Nous l'avons modifié en objet et en supprimant IDispatch, puis en supprimant stdole des références.

1

Cette question est également abordée ici: Why is Visual Studio 2015 adding stdole.dll and Microsoft.AnalysisServices.AdomdClient.dll to my project?

Mise à niveau d'un projet plus ancien à VS 2015 est ce qui a causé stdole.dll pour commencer à obtenir inclus dans le projet dans ce cas.

Si le référencement de la bibliothèque a l'option "Intégrer les types d'interopérabilité" dans les propriétés, cela est préférable et le fichier stdole.dll ne sera peut-être plus nécessaire après cela. Il suffit de définir Embed Interop Types=true dans les propriétés de la référence.

Les bibliothèques qui permettent cela comprennent les bibliothèques MS Office telles que Office, Excel, Core. Crystal Reports en est un exemple.

Hans Passantdissuade fortement les mise en Embed Interop Types=false ici: What's the difference setting Embed Interop Types true and false in Visual Studio?