2008-11-26 13 views
5

Ceci est à tous les gourous C#. Je me suis cogné la tête depuis un certain temps déjà, j'ai essayé toutes sortes de conseils sur le net sans succès. L'action se passe dans Windows Mobile 5.0.Comment résoudre l'exception .NET CF "Impossible de trouver PInvoke DLL"?

J'ai une DLL nommée MyDll.dll. Dans le MyDll.h je:

extern "C" __declspec(dllexport) int MyDllFunction(int one, int two); 

La définition de MyDllFunction dans MyDll.cpp est:

int MyDllFunction(int one, int two) 
{ 
    return one + two; 
} 

La classe C# contient la déclaration suivante:

[DllImport("MyDll.dll")] 
extern public static int MyDllFunction(int one, int two); 

Dans le même classe J'appelle MyDllFunction de la manière suivante:

int res = MyDllFunction(10, 10); 

Et c'est là que la chose sanglante continue à me donner "Impossible de trouver PInvoke DLL 'MyDll.dll'". J'ai vérifié que je peux réellement faire la PInvoke sur les appels système, tels que « GetAsyncKeyState (1) », a déclaré que:

[DllImport("coredll.dll")] 
    protected static extern short GetAsyncKeyState(int vKey); 

Le MyDll.dll est dans le même dossier que l'exécutable, et j'ai aussi essayé de le mettre dans le dossier/Windows sans modifications ni succès. Tout conseil ou solution sont grandement appréciés.

+0

Assurez-vous de disposer de suffisamment de mémoire virtuelle libre, car l'importation P/Invoke peut échouer. – arul

+0

Avez-vous ajouté la dll comme référence dans votre projet? Si vous le faites, vous n'aurez pas besoin de copier le fichier manuellement.Si le problème persiste, c'est probablement dû au fait que le fichier dll n'est pas construit correctement (plate-forme différente peut-être). – kgiannakakis

+0

Les deux projets sont dans la même solution et ils sont déployés ensemble, pas besoin de télécharger manuellement. –

Répondre

2

Peut-être cela semble-t-il une chose évidente à vérifier, mais compilez-vous la DLL native pour l'architecture de CPU correcte? IIRC, Windows Mobile s'exécute sur plusieurs architectures de CPU.

+0

Windows Mobile fonctionne sur l'architecture ARM seulement et a depuis Pocket PC 2003. – ctacke

+0

Ahh, d'accord. Était inconscient de cela. Merci pour la correction. –

+1

Pour ceux qui trouvent leur chemin ici, voir la réponse donnée par Ignas lui-même quant à la raison pour laquelle il a accepté cette réponse. –

0

L'exception que vous avez répertoriée et la signature pinvoke que vous avez insérée dans la question ont des noms différents: MyDll.dll et ThreadBenchLib.dll respectivement. Était-ce une faute de frappe ou le problème?

Si ce n'est pas le problème, essayez d'ouvrir la DLL au depends. Il est possible que la charge DLL échoue en raison d'une dépendance non satisfaite.

+0

Il était typo, le vrai nom est MyDll.dll –

4

J'ai le même problème, mais cette fois il n'y a pas de différence évidente dans les plates-formes impliquées. Pourquoi est-ce quelque chose qui est censé être «normal» est si mal documenté, si difficile et pire de tout «floconneux». Y a-t-il des outils qui me permettent d'aller sur mon émulateur PPC, et vérifier étape par étape (a) que la DLL est où CLR l'attend (je l'ai mis dans le même répertoire, et le répertoire windows sur l'émulateur - Je peux voir que c'est là l'explorateur de fichier des émulateurs), (b) que CLR peut le charger (a assez de mémoire etc), (c) que CLR peut alors trouver quelles fonctions sont présentes (utile si je peux aller au-delà du stupide ' ne peut pas trouver la dll » erreur)

J'aimerais forcer Gates ou bien l'un des « équipe de windows mobile » utiliser la merde qu'ils créent.

0

J'ai le même problème. J'ai utilisé le Depends.exe pour rechercher les dépendances WinCE dll, et Cela dépend de debug dll. (MSVCR90D.dll) Pour résoudre le problème j'ai compilé une version de version, et confirme les dépendances, après cela cela fonctionne très bien.

Questions connexes