C#调用Dll出错(有关结构体) 资料也好难查

x280125626 2010-03-08 04:52:57
用C++代码生成的 DLL 被.net的C#调用
C++代码
#define WIN32API __declspec(dllexport)
typedef struct PPP
{
unsigned char a[10];
unsigned int b;
};
PPP ppp;
extern "C"
WIN32API
void SetPPP(PPP p)
{
ppp=p;
}
extern "C"
WIN32API
PPP GetPPP()
{
return ppp;
}

请问如何写C#调用代码?
下面是我自己写的,但是总是有问题
[StructLayout(LayoutKind.Sequential)]
public struct PPP
{
[MarshalAs(UnmanagedType.???(不知道写什么),SizeConst = 10)]
public Byte[] a;
public int b;
}
[DllImport("Center.dll", ExactSpelling = true)]
public static extern void SetPPP(PPP p);
[DllImport("Center.dll", ExactSpelling = true)]
public static extern PPP GetPPP();

请问如何写正确?
...全文
415 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
FreyPan 2012-10-15
  • 打赏
  • 举报
回复
楼主问题解决了吗?我也报“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”的错误。
你是如何解决的?
oneatree 2010-05-15
  • 打赏
  • 举报
回复
mark
x280125626 2010-03-09
  • 打赏
  • 举报
回复
已结贴 感谢“xingyuebuyu”的思路
下面贴出本题答案:
extern "C"
WIN32API
void GetPPP(PPP *p)
{
*P=ppp;
}

[DllImport("Center.dll", ExactSpelling = true)]
public static extern void GetPPP(ref PPP p);

代替原有的 PPP GetPPP();达到传出结构值
x280125626 2010-03-09
  • 打赏
  • 举报
回复
搞不定 ~ 请高手======== 其实就是问怎么调用DLL中函数返回值是结构体并且结构体中有简单一维数组
HELP ME
phl1025 2010-03-09
  • 打赏
  • 举报
回复
[DllImport("Pul.dll",
EntryPoint = "InitDll", CallingConvention = CallingConvention.StdCall)]
public static extern int InitDll(string basePictpath, string serverIP, int port, int blankClr, int tezhClr);
这样就可以了
xingyuebuyu 2010-03-08
  • 打赏
  • 举报
回复
那就改成这样
extern "C"
WIN32API
void GetPPP(PPP *p)
{
PPP *P=ppp;
}


[DllImport("Center.dll", ExactSpelling = true)]
public static extern void GetPPP(ref PPP p);
x280125626 2010-03-08
  • 打赏
  • 举报
回复
尝试了 在 IntPtr ii = GetPPP(); 这里报“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”的错误。
是否应该改动C++源码中的
extern "C"
WIN32API
PPP GetPPP()
{
return ppp;
}
的写法(返回值?)
xingyuebuyu 2010-03-08
  • 打赏
  • 举报
回复
[DllImport("Center.dll", ExactSpelling = true)]
public static extern IntPtr GetPPP();

IntPtr ii = GetPPP();
PPP pp = new PPP();
pp = (PPP)Marshal.PtrToStructure(ii, typeof(PPP));

这样调用
x280125626 2010-03-08
  • 打赏
  • 举报
回复
调用SetPPP没问题 调用GetPPP运行时报错 怎么办呢 急
错误文本“方法的类型签名与 PInvoke 不兼容。”
x280125626 2010-03-08
  • 打赏
  • 举报
回复
能帮我试试通过一下吗 正解马上给分结贴
Alden 2010-03-08
  • 打赏
  • 举报
回复
[MarshalAs(UnmanagedType.ByValArray,SizeConst =10)]
不知道是否可以
xingyuebuyu 2010-03-08
  • 打赏
  • 举报
回复
另外你要看下C++中结构体的大小和C#中的结构体大小是否一致,如果不一样C#的结构体还要修改
xingyuebuyu 2010-03-08
  • 打赏
  • 举报
回复
[StructLayout(LayoutKind.Sequential)]
public struct PPP
{
[MarshalAs(UnmanagedType.ByValArray,SizeConst = 10)]
public Byte[] a;
public int b;
}

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧