[英]C# calling an unmanaged C driver(dll)
我真的不確定我做錯了什么。 我正在將一個字符串傳遞給我用C#編寫的Cll作為網絡狀態下的大量示例..由於某種原因,字符串在C dll中顯示為NULL。 我知道我做錯了什么?
C:
extern __declspec(dllexport) void Cmd(long CmdType,long DataPar, const char *DataStr);
void Cmd(long CmdType,long DataPar,const char *DataStr)
{
// DataStr is NULL here even when passing a string with data in it
}
C#:
[DllImport(@"pjsua-i386-Win32-vc8-Debug.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern void Cmd(long CmdType, long DataPar,[MarshalAs(UnmanagedType.LPStr)]String s);
Cmd(1,0,"TEST");
我還嘗試過其他的東西,比如IntPtr和編組整個字符串,但所有結果都與NULL相同。 還有一堆其他的東西。
在Microsoft C ++和C中,在32位和64位構建上,long只有32位。
但是,在C#中,long總是64位。
所以我認為正在發生的是,C#調用被壓入堆棧的兩個64位長的一些字節被彈出作為C ++中的Data*
。
因為您要推送的第二個參數是0,所以會發生值為0的字節用於指針,因此它為空。
將聲明更改為int
而不是long
來解決您的問題。
您是否嘗試過以下選項:
[DllImport(@"pjsua-i386-Win32-vc8-Debug.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern void Cmd(int CmdType, int DataPar,IntPtr s);
Cmd(1,0,Marshal.StringToHGlobalAnsi(str));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.