日期:2014-05-18 浏览次数:21426 次
C++ SNMPAPI_STATUS SnmpStrToOid( __in LPCSTR string, __out smiLPOID dstOID );
------解决方案--------------------
[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct SMIOID
{
[System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.I4)]
public uint size;
public IntPtr dwords;
}
------解决方案--------------------
注意第一个参数的类型是LPCSTR,而不是LPCTSTR。所以你要用[DllImport("wsnmp32.dll", CharSet=ANSI)](不是确切代码,大概如此)。
还有就是如果不是OUT类型的字符串参数,可以不使用StringBuilder。这里明显可以不用StringBuilder。
------解决方案--------------------
检查字符类型
------解决方案--------------------
用UnmanagedType试试.我之前也碰到过这个问题,将变量声明为UnmanagedType就解决了.
------解决方案--------------------
我看第一个象是C++里面没有符号的32位Long型数据,所以对应的应该是Uint32 没有错,可能是第二个参数需要限定下程度,也是32位,如果还不行我也没办法了:
StructLayout(LayoutKind.Sequential)]
public struct SMIOID
{
public Uint32 size;
[MarshalAs(UnmanagedType.I4, SizeConst=32)]
public IntPtr dwords;
}
//然后调用的指针的函数改成下面的
[DllImport("wsnmp32.dll")]
public static extern SNMPAPI_STATUS SnmpStrToOid(StringBuilder str, out ref SMIOID oid);
StringBuilder name2 = new StringBuilder(256);
name2.Append("1.3.6.1.2.1.2.2.1.16");
SnmpAPI.SnmpStrToOid(name2, out ref Oid);
------解决方案--------------------
这个问题我也遇到过,最终检查问题出在DLL里面,里面通过指针动态申请的空间没有释放.不知道你是不是跟我一样的.