关于c#调用c++写的DLL的参数类型问题

snake3760 2008-02-22 01:58:11
有一个c++写的dll,有个函数参数类型是一个结构体,我在c#中调用的时候,参数是一个属性类,我想问的是属性类和结构体可以通用吗?这样能调用成功吗?
...全文
530 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
pfl0403 2011-04-05
  • 打赏
  • 举报
回复
还是不行?
我在地球 2008-03-23
  • 打赏
  • 举报
回复
学习
jimgreat 2008-03-08
  • 打赏
  • 举报
回复


如果c++写的dll中一个函数返回值是一个结构体指针,如果调用失败就返回null,那么c#
中相应的该怎么做呢

谈一下我的看法
对返回值是一个结构体指针,在C#中可以用IntPtr来接收返回值,本质上说指针也就是个地址的编号,接收这个返回值没有什么难的,
关键是如何读取指针所指向的结构中的数据,这个返回的指针是在非托管环境下的,可以用Marshal.PtrToStructure将数据从非托
管内存块封送到托管对象托管,也就是转成C#的结构体。

至于null我想就是IntPtr.Zero了,判断一下就行了。
真相重于对错 2008-02-25
  • 打赏
  • 举报
回复
example

typedef struct _MYPERSON2
{
MYPERSON* person;
int age;
} MYPERSON2, *LP_MYPERSON2;

int TestStructInStruct(MYPERSON2* pPerson2);



[ StructLayout( LayoutKind.Sequential )] //注意要用structlayout定义.net结构具体尺寸,具体含义查msdn
public struct MyPerson2
{
public IntPtr person;
public int age;
}
[ DllImport( "..\\LIB\\PinvokeLib.dll" )]
public static extern int TestStructInStruct( ref MyPerson2 person2 );

shinaterry 2008-02-25
  • 打赏
  • 举报
回复
-_-!!! 代码前面已经给过, 原理一样...
shinaterry 2008-02-25
  • 打赏
  • 举报
回复
extern "C" __declspec( dllexport ) [结构体] HelloWorld( A a );
extern "C" __declspec( dllimport ) [结构体] HelloWorld( A a );


[DllImport("{C++.dll编译后的地址}")]
public static extern [结构体] HelloWorld(A a);
snake3760 2008-02-25
  • 打赏
  • 举报
回复
在线等答案
snake3760 2008-02-25
  • 打赏
  • 举报
回复
不能更改结构体,主要问题在于c++写的dll中一个函数返回值是一个结构体指针,c#中怎么调用,谁是否可以给个调用实例
shinaterry 2008-02-25
  • 打赏
  • 举报
回复
^o^ 可以在结构体利用标记来标识返回的是否合法值...
snake3760 2008-02-25
  • 打赏
  • 举报
回复
自己顶一下,在线等
snake3760 2008-02-25
  • 打赏
  • 举报
回复
谢谢楼上各位热心的朋友,我还有一个疑问,就是如果c++写的dll中一个函数返回值是一个结构体指针,如果调用失败就返回null,那么c#
中相应的该怎么做呢
paulin 2008-02-22
  • 打赏
  • 举报
回复
是的 这样参数就一直了,传值应该没有问题的
你试一下
shinaterry 2008-02-22
  • 打赏
  • 举报
回复
^o^ 仅供参考, C#中记得 using System.Runtime.InteropServices;
shinaterry 2008-02-22
  • 打赏
  • 举报
回复
假如C++中有结构体A:

typedef struct a
{
BOOL v1;
LONG v2;
} A;

extern "C" __declspec( dllexport ) void HelloWorld( A a );
extern "C" __declspec( dllimport ) void HelloWorld( A a );


那么C#则要与其对应:

public struct A
{
public bool v1;
public long v2;
}

[DllImport("{C++.dll编译后的地址}")]
public static extern void HelloWorld(A a);


shinaterry 2008-02-22
  • 打赏
  • 举报
回复
^o^ 需要在C#创建相应的结构体作为参数类型...
snake3760 2008-02-22
  • 打赏
  • 举报
回复
楼上朋友的意思是说c#中的结构体跟c++中的结构体是通用的?
paulin 2008-02-22
  • 打赏
  • 举报
回复
如果不成,那就属性类的值转成相应结构体的值,再传进去...
snake3760 2008-02-22
  • 打赏
  • 举报
回复
调用了,没有出现预期效果,所以我想问下是不是参数类型不匹配的问题
Tll_W 2008-02-22
  • 打赏
  • 举报
回复
lz没有调用成功还是没有调用呢?

110,533

社区成员

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

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

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