C++和c#互操作,我用C++写的动态链接库,但是C++里面定义的结构体,C#里面不认识怎么办啊?
3个回答
展开全部
我来专业回答你的问题吧:
在C#中调用C++或系统DLL是比较常见的操作。
例如C++中定义的以下结构体:
struct RCEStruct ;
同时有一个公开方法:
extern "C" __declspec WORD CALLBACK GetStruct(RCEStruct* pEventStruc);
我们将它编译为 MyCppDll.DLL
那么我们在C#中可以直接定义相同的结构体和引用GetStruct:
[StructLayout(LayoutKind.Sequential)]
publicstruct RCEStruct publicintpublicintpublicchar[40"MyCppDll.dll", CharSet=publicstaticexternint GetStruct(RCEStruct rce);
注意C#里定义的结构体应该和C++里定义的一样。这里如果是public string User就有可能出错(具体我没试过,不知道C#是否会自动将char[]转变为string,另外还要注意,在C#中为User赋值时,长度不应超过40)。
通过这种方式我们就可以向C++传递或者获得结构体。但一个限制就是必须在C#端主动调用GetStruct()
在C#中调用C++或系统DLL是比较常见的操作。
例如C++中定义的以下结构体:
struct RCEStruct ;
同时有一个公开方法:
extern "C" __declspec WORD CALLBACK GetStruct(RCEStruct* pEventStruc);
我们将它编译为 MyCppDll.DLL
那么我们在C#中可以直接定义相同的结构体和引用GetStruct:
[StructLayout(LayoutKind.Sequential)]
publicstruct RCEStruct publicintpublicintpublicchar[40"MyCppDll.dll", CharSet=publicstaticexternint GetStruct(RCEStruct rce);
注意C#里定义的结构体应该和C++里定义的一样。这里如果是public string User就有可能出错(具体我没试过,不知道C#是否会自动将char[]转变为string,另外还要注意,在C#中为User赋值时,长度不应超过40)。
通过这种方式我们就可以向C++传递或者获得结构体。但一个限制就是必须在C#端主动调用GetStruct()
追问
C++里面结构体是这样定义的
typedef struct hash_list_func_pool_s
{
int (*hashFunc)(void*); /*散列算法函数*/
}hash_list_func_pool_t;
typedef struct wlan_hash_obj_s
{
hash_list_func_pool_t *func_pool; /*函数指针池*/
void (*selfInit)(void ); /*hash对象初始化函数*/
}wlan_hash_obj_t;后面那几个指针函数怎么改啊?
追答
int (*hashFunc)(void*); /*散列算法函数*/
void (*selfInit)(void ); /*hash对象初始化函数*/
上面这两个都是函数指针。
hash_list_func_pool_t *func_pool; /*函数指针池*/
下面这个应该是集合指针。
不知道你的程序是要怎么实现功能的,改应该是可以的,根据你的程序功能而定
展开全部
e.g.
struct student
{
char a[20];
int ID;
};
student st[2]=,};
//和数组的初始化差不多。
--如果是指针的话,是无法在定义时被初始化的。
student *st1=new student[2];
就像实例化类的对象一样,指针对象也是不能再定义时被初始化的。
struct student
{
char a[20];
int ID;
};
student st[2]=,};
//和数组的初始化差不多。
--如果是指针的话,是无法在定义时被初始化的。
student *st1=new student[2];
就像实例化类的对象一样,指针对象也是不能再定义时被初始化的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
C#中也有结构体啊。你定义了结构体,照样可以用的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询