6.15. Why do I get a MissingMethodException when I call a function from a native DLL?
There are several issues to consider when determining the case of a MissingMethodException. When this exception occurs you should verify the following:
If targeting Pocket PC 2003 use Microsoft eMbedded Visual C++ 4.0.
If targeting Pocket PC 2000 or 2002 use Microsoft eMbedded Visual Tools 3.0
Verify that the parameters to the function match those of the original
A long in native code is typically 32-bits, whereas in the .NET Compact Framework it is 64-bits
Beware of bool
According to MSDN documentation, "Its size is unspecified.":
In a Microsoft specific section of the MSDN documentation, the bool size is described as varying depending on the version of Visual C++ used to build the binary.:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vccelng4/html/ellrfbool.asp
A BOOL is defined as an int (32-bit value)
.NET Compact Framework Blittable Types:
Non Blittable Types and Marshaling Support:
http://msdn.microsoft.com/library/en-us/dv_evtuv/html/etconNonBlittableTypesMarshalingSupport.asp
Make sure that the function name is spelled correctly
Verify that the DLL is located correctly - Windows or executing folder of target device
Verify with DUMPBIN that the names of the functions were not mangled on exporting of the DLL (extern "C" fixes this). More information on this topic can be found in section "6.1. How do I call a function that is in a native DLL?" of this FAQ.
Verify that the DLL being imported is not dependant upon other DLLs. A missing dependant DLL will result in the MissingMethodException. For the latest Microsoft eMbedded Visual Tools and SDK downloads, visit the MSDN Mobile and Embedded Developer Center "Products & Updates" download page at:
http://msdn.microsoft.com/mobility/downloads/updates/default.aspx
6.16. How do I set the system time?
You can set the system time by P/Invoking the SetSystemTime function. //C#
using System.Runtime.InteropServices;
public struct SYSTEMTIME
{
public ushort wYear;
public ushort wMonth;
public ushort wDayOfWeek;
public ushort wDay;
public ushort wHour;
public ushort wMinute;
public ushort wSecond;
public ushort wMilliseconds;
}
[DllImport("coredll.dll")]
public extern static void GetSystemTime(ref SYSTEMTIME lpSystemTime);
[DllImport("coredll.dll")]
public extern static uint SetSystemTime(ref SYSTEMTIME lpSystemTime);
// Set the clock ahead one hour
SYSTEMTIME st = new SYSTEMTIME();
GetSystemTime(ref st);
st.wHour = (ushort)(st.wHour + 1 % 24);
SetSystemTime(ref st);
'VB
Imports System.Runtime.InteropServices
Public Structure SYSTEMTIME
Public wYear As UInt16
Public wMonth As UInt16
Public wDayOfWeek As UInt16
Public wDay As UInt16
Public wHour As UInt16
Public wMinute As UInt16
Public wSecond As UInt16
Public wMilliseconds As UInt16
End Structure
<DllImport("coredll.dll")> _
Public Shared Sub GetSystemTime(ByRef lpSystemTime As SYSTEMTIME)
End Sub
<DllImport("coredll.dll")> _
Public Shared Function SetSystemTime(ByRef lpSystemTime As SYSTEMTIME) As UInt32
End Function
'Set the clock ahead one hour
Dim st As New SYSTEMTIME
GetSystemTime(st)
st.wHour = Convert.ToUInt16(((Convert.ToInt32(st.wHour) + 1)) Mod 24)
SetSystemTime(st)