2010-07-24 9 views
8

J'utilise DllImport pour accéder à certaines fonctions dans une DLL C++ de mon application C#.Win 7 DllImport C# Erreur étrange, Accès non valide à l'emplacement de la mémoire?

Ce code fonctionne très bien sur mon ordinateur portable dev, qui est Windows 7 64bit, la DLL elle-même est de 32 bits, donc je cours le processus d'hébergement de la DLL en 32 bits et ça fonctionne bien. Cependant, quand j'essaie d'exécuter exactement le même processus sur ma machine cible, ce qui est encore, Windows 7 64bit Ultimate je reçois l'erreur 'Accès invalide à l'emplacement de la mémoire.' du processus.

Je ne sais pas quel est le problème, j'ai regardé des tonnes de ressources sur le net et aucun d'entre eux ne l'a résolu pour moi. Je ne comprends pas pourquoi cela fonctionne bien sur ma boîte de dev, mais pas sur la cible?

La DLL elle-même est très bien, les exemples qui viennent avec la DLL fonctionnent tous très bien sur ma boîte cible (qui sont des applications C# DllImport).

Est-ce que quelqu'un d'autre a eu ce problème? Je me suis battu pendant deux jours maintenant!

Exception: {"Unable to load DLL 'CLEyeMulticam.dll': Invalid access to memory location. (Exception from HRESULT: 0x800703E6)"}

+0

DEP est comme OptIn (qui est essentiellement DEP activé) sur ma boîte de développement. Mais cela n'a aucun problème ... J'ai essayé de trouver des différences, mais j'ai mis les deux machines avec la même ISO, à la fois avec VS2010, Robotics Framework RC3, et le même Dll j'essaie d'accéder. Mais essayez comme je pourrais, je ne peux pas obtenir cette nouvelle machine pour obtenir un cadre de robotique lisant la DLL correctement !! – James

+0

J'ai également essayé de reformater totalement la machine, j'ai toujours le même problème. – James

+0

Je n'ai pas réussi à résoudre ce problème. Cela n'est arrivé que lors de l'utilisation de la DLL dans Microsoft Robots Studio. À la fin, j'ai dû créer une nouvelle application pour héberger la DLL, et communiquer des processus croisés via les canaux nommés WCF :( – James

Répondre

0

J'ai eu ce problème auparavant. Je pense que votre problème est avec VS essayant d'ouvrir le fichier mais n'ayant pas les permissions pour le lire. Vous devez vous assurer que le compte que vous utilisez a accès à la DLL. Essayez de désactiver l'UAC pour voir si cela fonctionne ou utilisez un compte administrateur. Ou essayez de donner Full Control sur la DLL à Everyone.

EDIT: Pourriez-vous exécuter VS en tant qu'administrateur (clic droit -> Exécuter en tant qu'administrateur)? Pourriez-vous mettre la DLL sur votre bureau pour essayer? Y a-t-il une différence de structure de dossier entre votre ordinateur de travail et celui qui échoue? En outre, la DLL peut-elle fonctionner correctement si vous l'exécutez en dehors de VS (essayez de l'exécuter aussi en tant qu'administrateur)?

HTH

+0

@James - Voir mon edit ci-dessus – TheCloudlessSky

+0

Oui les dossiers sont les mêmes.Le processus que j'essaye de courir s'appelle DssHost.exe, une partie de Microsoft Robotics Studio. Il est dans C: \ Robotics \ Bin \ DssHost.exe avec ma DLL 'CLEyeMulticam.dll' (c'est la même chose sur les deux ordinateurs.) DssHost prend la DLL .NET (PS3WebcamService.dll) j'écris dans VS (déployé sur C: \ Robotics \ Bin \, le charge avec DssHost, et l'exécute Seulement sur ma boîte de dev originale fait ce travail, une autre nouvelle boîte se plaint de cette erreur ci-dessus.Mais mon boîte de dev a DEP allumé? (UAC désactivé.) Suite ... – James

+0

Si j'essaie d'exécuter le même code qui se trouve dans ma DLL .NET via une application .NET Windows Form séparée, cela fonctionne correctement sur les deux ordinateurs. Je ne comprends pas la différence est entre mon application .NET Windows, et le DSSHost .net qui héberge les dll Service, et pourquoi il n'affecte que cette seconde machine Ps - Naughty I k maintenant, mais je cours toujours VS en tant qu'administrateur. Le démarrage de DssHost à partir d'une ligne Admin Cmd me donne la même erreur. Merci pour votre aide :) – James

1

Le chargement de DLL peut se bloquer en raison des dépendances non résolues, alors ouvrez votre DLL sur la machine cible à l'aide Dependency Walker et voir est-il des problèmes.

+1

http://www.dependencywalker.com/ –

+0

Sera-t-il écrasé avec le message 'Accès invalide à l'emplacement de la mémoire' dans un tel cas? – Pupsik

1

Je remarque une grande différence entre votre machine dev et votre machine cible, l'environnement de développement. Assurez-vous d'avoir tous les redistribuables nécessaires sur la machine cible. Edit: J'ai rencontré des problèmes similaires lorsque certaines DLL ont été compilées dans différentes versions de l'infrastructure .Net ou si elles ont été créées avec différentes versions de Visual Studio, car les redistribuables de chaque version sont différentes et les dernières redistribuables ne sont pas exactement rétrocompatible.

0

J'ai eu des problèmes similaires avant, essayez ce qui suit.

  • Vérifiez la version .NET CLR. Y a-t-il des SP/KB présents dans votre cible qui ne sont pas dans votre dev?
  • Essayez de charger la version de débogage de la DLL C++. Êtes-vous capable de le charger? Si cela échoue, je suggère de démarrer votre application sous WinDBG dans votre cible. Une fois l'exception atteinte, un simple! Analyse -v vous donnera beaucoup d'informations.
  • Dans une prochaine étape, , j'essayerais de reproduire ce problème dans un environnement de test unitaire. Les exemples C# que vous avez mentionnés sont-ils construits pour x64 VM? Si ce n'est pas le cas, essayez de le faire et essayez d'exécuter l'exemple binaire résultant dans votre cible. Le problème est-il reproductible?
0

J'ai rencontré un problème avec un 64bit.Application NET ("Any CPU") essayant de charger une dépendance de DLL native 32 bits. Je n'ai pas le message d'erreur devant moi, donc je ne peux pas vous dire si c'est le même problème. La solution à mon problème était de changer ma construction en x86 seulement.

Si la taille des bits de la DLL change sur chaque boîte, il existe peut-être des différences de taille de structure, de sorte que votre signature PInvoke devient incorrecte. Cela peut facilement provoquer un dépassement de la mémoire tampon et entraîner une corruption de la pile dans le code natif.

0

Si vous obtenez l'erreur dans votre application C#, ce message indique souvent le code natif a fait quelque chose de désagréable à la mémoire que l'ILM peut voir - vérifier le code dans/appelé par votre DllMain routine - qui est appelé avant que votre appel se passe réellement - si elle se comporte mal, vous verriez ce résultat

0

@Merlyn Morgan-Graham Nous avons fait face à un problème similaire. Où nous avons construit l'application .Net avec la construction "Any CPU" et essayé d'utiliser avec 32 bits C++ Dll. Lorsque nous exécutons l'application .Net dans un système d'exploitation 64 bits. Il s'exécute comme un exécutable 64 bits et par conséquent, a un problème similaire. Après l'installation dans X86 Loading, les appels vers les DLL C++ fonctionnaient parfaitement. Une chose plus importante est si vous utilisez la DLL C++ dans votre code .Net. Il y aurait une bonne quantité de marshalling, donc il est important de s'en tenir au type de construction (c'est-à-dire X86, n'importe quel CPU ou X64).

S'il vous plaît vérifier le lien suivant aussi: Windows Vista: Unable to load DLL 'x.dll': Invalid access to memory location. (DllNotFoundException)

0

La solution évidente, mais probablement boiteux serait de construire côté C# explicitement pour 32 bits. Vérifiez comment créer en dehors de l'hôte proc - par programmation ou en remplissant les clés de registre ou ... peut être que sur une autre boîte il est configuré pour effectuer un processus d'hébergement 64 bits ou tenter une invocation in-proc, ce qui signifie charger .. C'est un paramètre de registre, n'oubliez pas que pour les cas mixtes de 23/64 bits, il y a deux branches à explorer.

1

J'ai eu le même problème ici Native loading works good. Loading from .net gives error Unable to load DLL 'my.dll': Invalid access to memory location

Le problème était en fonction DEP. Lorsque j'ai activé le DEP pour les programmes essentiels uniquement, cela n'a donné aucun résultat. Mais quand j'ai complètement éteint DEP et redémarré mon serveur, l'erreur est partie. Une chose de plus que j'ai fait - installé les dernières mises à jour pour. Net 4.0

La seule chose notable - je n'ai pas vu d'erreurs sur la DEP, juste la fermeture avec l'erreur "mémoire".