我在使用基于Windows Mobile 5.0模拟器的基本方案时遇到了很多麻烦.我有一个winforms应用程序,最终调用本机代码.部署工作正常,所有本机DLL都复制到winforms .exe相同的文件夹中.我还验证了远程文件查看器工具的情况.
但是,当我启动我的应用程序时,它始终失败并显示"无法找到PInvoke dll - System.MissingMethodException"错误(当调用本机代码时,DllImport属性将变为无用).我知道本机dll与可执行文件位于同一文件夹中.我还应该做些什么?
我正在使用VS 2008.
我在编组指向字符串数组的指针时遇到了一些麻烦.它看起来像这样无害:
typedef struct
{
char* listOfStrings[100];
} UnmanagedStruct;
Run Code Online (Sandbox Code Playgroud)
这实际上是嵌入在另一个结构中,如下所示:
typedef struct
{
UnmanagedStruct umgdStruct;
} Outerstruct;
Run Code Online (Sandbox Code Playgroud)
非托管代码回调到托管代码,并将Outerstruct作为IntPtr返回,并分配内存并填入值.
[StructLayout(LayoutKind.Sequential)]
public struct UnmanagedStruct
{
[MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.LPStr, SizeConst=100)]
public string[] listOfStrings;
}
[StructLayout(LayoutKind.Sequential)]
public struct Outerstruct
{
public UnmanagedStruct ums;
}
public void CallbackFromUnmanagedLayer(IntPtr outerStruct)
{
Outerstruct os = Marshal.PtrToStructure(outerStruct, typeof(Outerstruct));
// The above line FAILS! it throws an exception complaining it cannot marshal listOfStrings field in the inner struct and that its managed representation is incorrect!
}
Run Code Online (Sandbox Code Playgroud)
如果我将listOfStrings改为简单地为IntPtr,那么Marshal.PtrToStructure可以工作,但现在我无法翻录到listOfStrings并逐个提取字符串.