2008-11-26 14 views
5

Esto es para todos los gurús de C#. Me he estado dando vueltas en esto desde hace un tiempo, intenté todo tipo de consejos en la red sin ningún resultado. La acción está sucediendo en Windows Mobile 5.0.¿Cómo resuelvo la excepción .NET CF "No se puede encontrar la DLL de Invoke"?

Tengo un archivo DLL llamado MyDll.dll. En el MyDll.h tengo:

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

La definición de MyDllFunction en MyDll.cpp es:

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

La clase C# contiene la siguiente declaración:

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

en el mismo clase Estoy llamando a MyDllFunction de la siguiente manera:

int res = MyDllFunction(10, 10); 

Y aquí es donde lo sangriento me sigue dando "No se puede encontrar la DLL de PInvoke 'MyDll.dll'". He comprobado que realmente puedo hacer lo PInvoke en llamadas al sistema, como por ejemplo "GetAsyncKeyState (1)", declaró como:

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

El Mydll.dll está en la misma carpeta que el ejecutable, y también he intenté ponerlo en la carpeta/Windows sin cambios ni éxito. Cualquier consejo o solución es muy apreciado.

+0

Asegúrese de tener suficiente memoria virtual libre, ya que la importación P/Invoke puede fallar en eso. – arul

+0

¿Ha agregado el dll como referencia en su proyecto? Si lo hace, entonces no necesitará copiar el archivo manualmente.Si el problema persiste, es probable que se deba a que el archivo dll no se compiló correctamente (quizás una plataforma diferente). – kgiannakakis

+0

Ambos proyectos están en la misma solución y se implementan juntos, no es necesario cargarlos manualmente. –

Respuesta

2

Quizás esto parezca algo obvio para verificar, pero ¿está compilando la DLL nativa para la arquitectura de CPU correcta? IIRC, Windows Mobile se ejecuta en múltiples arquitecturas de CPU.

+0

Windows Mobile se ejecuta en arquitectura ARM solamente y desde Pocket PC 2003. – ctacke

+0

Ahh, está bien. No estaba consciente de eso. Gracias por la corrección. –

+1

Para quienes encuentren el camino hasta aquí, vean la respuesta dada por el mismo Ignas sobre por qué aceptó esta respuesta. –

0

La excepción que enumeró y la firma de pinvoke que puso en la pregunta tienen diferentes nombres: MyDll.dll y ThreadBenchLib.dll, respectivamente. ¿Eso fue un error tipográfico o el problema?

Si no es el problema, intente abrir la DLL en depends. Es posible que la carga DLL esté fallando debido a una dependencia no satisfecha.

+0

Fue un error tipográfico, el verdadero nombre es MyDll.dll –

4

Tengo el mismo problema, pero esta vez no hay una diferencia obvia en las plataformas involucradas. ¿Por qué es algo que se supone que es 'normal' está tan mal documentado, tan difícil y lo peor de todo es 'escamoso'. ¿Hay CUALQUIER herramienta que me permita ir a mi emulador PPC, y detener paso a paso la comprobación (a) de que dll es donde CLR lo espera (lo puse tanto en el mismo directorio como en el directorio de Windows en el emulador? Puedo ver que está allí con el explorador de archivos emuladores), (b) que CLR puede cargarlo (tiene suficiente memoria, etc.), (c) que CLR puede encontrar qué funciones están presentes (útil si puedo ir más allá de lo estúpido ' no puede encontrar el error dll '

Me encantaría forzar a Gates o incluso a cualquiera del equipo de' windows mobile 'a usar la basura que crean.

0

Estoy teniendo el mismo problema. Utilicé Depends.exe para buscar dependencias de DLL de WinCE y depende de debug dll. (MSVCR90D.dll) Para resolver el problema compilé una versión de lanzamiento y confirmo las dependencias, después de eso funciona bien.

Espero ayudar

Cuestiones relacionadas