C# – How to solve the .NET CF exception “Can’t find PInvoke DLL”

cnetpinvokewindows-mobile

This is to all the C# gurus. I have been banging my head on this for some time already, tried all kinds of advice on the net with no avail. The action is happening in Windows Mobile 5.0.

I have a DLL named MyDll.dll. In the MyDll.h I have:

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

The definition of MyDllFunction in MyDll.cpp is:

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

The C# class contains the following declaration:

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

In the same class I am calling MyDllFunction the following way:

int res = MyDllFunction(10, 10);

And this is where the bloody thing keeps giving me "Can't find PInvoke DLL 'MyDll.dll'". I have verified that I can actually do the PInvoke on system calls, such as "GetAsyncKeyState(1)", declared as:

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

The MyDll.dll is in the same folder as the executable, and I have also tried putting it into the /Windows folder with no changes nor success. Any advice or solutions are greatly appreciated.

Best Answer

I have the same problem, but this time there is no obvious difference in the platforms involved. Why is it something that is supposed to be 'normal' is so badly documented, so difficult and worst of all so 'flaky'. Are there ANY tools that allow me to go onto my PPC emulator, and stop by step check (a) that the dll is where CLR expects it (I have put it both in the same directory, and the windows directory on the emulator - I can see it is there usign the emulators file explorer), (b) that CLR can load it (has enough memory etc), (c) that CLR can then find what functions are present (useful if I can get beyond the stupid 'can't find the dll' error)

I'd love to force Gates or indeed any of the 'windows mobile' team to use the crap they create.