Question

Très bien, après avoir effectué une tonne de recherches et avoir essayé presque tous les Redist CPP gérés, je peux trouver et essayer de copier mes DLL localement dans le répertoire d'exécution de l'application. Je ne peux pas comprendre les dépendances qui manquent pour cet environnement mixte. bibliothèque de mode.

En gros, j’ai une grande application C # et j’essaie d’utiliser une bibliothèque en mode mixte que j’ai créée. Cela fonctionne parfaitement (bien sûr) sur la machine de développement, mais il est déployé lorsque la bibliothèque doit être chargée pour pouvoir utiliser des exceptions en raison de dépendances CRT manquantes (je suppose).

J'ai utilisé Dependency Walker pour vérifier toutes les DLL référencées et veiller à ce qu'elles existent sur la machine à déployer sans succès. Je me demande s'il est possible que certaines des dépendances à enregistrer soient manquantes, mais je ne peux pas comprendre quoi.

L'exception suivante apparaît lorsque le code tente d'instancier une classe à partir de la bibliothèque en mode mixte.

  

Détail de l'exception:   System.IO.FileLoadException: n'a pas pu   charger le fichier ou l'assembly 'USADSI.MAPI,   Version = 1.0.3174.25238,   Culture = neutre, PublicKeyToken = null '   ou une de ses dépendances. Ce   l'application n'a pas pu démarrer   parce que la configuration de l'application   est incorrect. Réinstallation du   L'application peut résoudre ce problème.   (Exception de HRESULT: 0x800736B1)

Je suis en train de compiler la bibliothèque à l'aide de VS2008 SP1 avec / clr: oldSyntax spécifié.

Le manifeste intermédiaire ressemble à ceci:

<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level='asInvoker' uiAccess='false' />
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
</assembly>

Je peux fournir d'autres informations si nécessaire. Malheureusement, je ne suis pas très familiarisé avec la création de bibliothèques en mode mixte, ce qui m'a donc jeté.

Si quelqu'un peut donner un conseil, je l'apprécierais grandement!

Était-ce utile?

La solution

Avez-vous déployé le CRT bibliothèques sur la machine cible? Long shot: puisque vous avez une dépendance sur le code 32 bits, vous devez définir Target Platform dans l'onglet de propriété Build sur x86.

EDIT: résoudre les problèmes côte à côte avec le Utilitaire Sxstrace.exe , disponible sur Vista.

Autres conseils

En règle générale, j'ai constaté que le commentaire pragma natorieusement snafu .

La similitude avec le fonctionnement de l’éditeur de liens et la compilation habituelle du code C, ainsi que le fait que vous en tenez simplement compte dans l’un de vos fichiers source, font que tout se sent un peu plus ensemble ;;

#pragma comment(linker, \
    "\"/manifestdependency:type='Win32' "\
    "name='Microsoft.Windows.Common-Controls' "\
    "version='6.0.0.0' "\
    "processorArchitecture='*' "\
    "publicKeyToken='6595b64144ccf1df' "\
    "language='*'\"")

J'ai eu un problème similaire la première fois que j'ai déployé une application VS 2005 sur une machine cible: je devais importer la DLL MSVCRT80. Voulez-vous dire que vous avez déjà la bibliothèque d’exécution VS 2008 à cet endroit?

ETA: Aussi, question idiote, mais êtes-vous sûr de disposer à la fois du CRT Runtime (lié au précédent) et du .NET Runtime, avec la même version que celle avec laquelle vous avez compilé (probablement 3.5)? Vous le savez probablement déjà (surtout compte tenu de votre score), mais ce sont deux choses différentes.

J'ai trouvé une solution qui semble fonctionner même si je ne l'aime pas beaucoup.

Je devais copier les dossiers:

Microsoft.VC90.CRT & amp; Microsoft.VC90.MFC

Depuis: Program Files \ Microsoft Visual Studio 9.0 \ VC \ Redist \ x86

Dans le répertoire de l'application déployée, je ne comprends pas pourquoi cela semble fonctionner et les redistribuables ne font rien.

EDIT: En regardant le manifeste, je n'ai probablement pas besoin de copier le répertoire MFC

Le meilleur moyen de résoudre ce problème est de télécharger le moniteur de processus, qui est gratuit: http://technet.microsoft.com/en-us/sysinternals/bb896645. aspx

Ajoutez un filtre pour surveiller uniquement votre processus et il vous montrera tous les accès aux fichiers que le processus tente d’essayer. Cela vous montrera exactement quelle dll ne peut pas être trouvée.

Je l'utilise toujours lorsque je suis confronté au même problème: si Microsoft remplissait seulement le nom du fichier dans l'exception levée, tout serait plus simple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top