我在C++ native dll中有以下功能,我想在C#应用程序中使用它。Pinvoke中的一个问题
DWORD __cdecl Foo(
LPCTSTR Input,
TCHAR** Output,
DWORD Options,
ErroneousWord** List = NULL,
LPDWORD Count = 0
);
使用的PInvoke
[DllImport("dllName", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
public static extern UInt32 Foo(string InputWord, out string Output, UInt32 Options, out object List,out UInt32 Count);
调用代码:
string output;
object dummyError = null;
uint dummyCount = 0;
uint x = 0;
Foo(Text, out output, x | y,out dummyError,out dummyCount);
我得到了以下异常
试图读取或写入受保护的内存 。这往往是一个迹象 其他内存已损坏
PS: ErroneousWord是结构,我并不需要它的输出,所以我名帅它作为对象
什么是'ErroneousWord'?不管它是什么,我都无法想象它可以编组成C#对象。那么'Output'参数呢?什么是协议的marhsalling呢? – 2011-05-16 14:21:07
输出是从本机代码创建的,并且有暴露的函数来释放它,所以本机代码分配输出并公开一个函数以释放它。 – 2011-05-16 14:31:16
我认为对于输出,您将需要使用'Marshal.PtrToStructure'。我对“错误的词”不太乐观。 – 2011-05-16 14:32:28