帮助!
我对完成一项看似相当容易的任务感到非常疲惫/沮丧。我不确定我做错了什么;如果我做得对,更不用说了。在开发WPF应用程序(VS 2010,C#4.0)时,我“需要”使用现有的库(C静态库 - 超过100,000行直接C代码)。哦,我无法触及现有的C代码 - 按原样使用它!
我已经阅读了很多帖子(高级主题,操作方法等),但我对C ++ / CLI这么新,以至于它没有意义。根据我的阅读,最好的方法是将C静态库包装如下:
非托管C静态库< ---> C ++ / CLI托管包装器DLL< ---> 托管WPF应用程序
这是剥离的C头文件:
/* Call this function to execute a command. */
int issue_command(int command, long param1, long param2);
/* Completion call back function; you must supply a definition. */
extern int command_completed(int command, long param1, long param2);
struct struct_command_str
{
char command_str[10];
char param1_st[2];
char param2_st[2];
char success;
};
/* You must supply definitions to the following extern items. */
extern int command_status;
extern struct struct_command_str command_str;
问题:
我似乎无法正确做的是为回调函数提供C ++ / CLI实现,以及两个extern项(command_status
和struct command_str
)。
有人可以为上述缺少的回调函数和外部函数提供示例C ++ / CLI实现吗?
提前感谢您的协助。
答案 0 :(得分:3)
在C ++ / CLI托管包装器项目中,添加2个文件:
.c文件:
extern void doSomething();
int command_status = 0;
struct_command_str command_str = { "command1", "p1", "p2", 't' };
int command_completed(int command, long param1, long param2) {
...
command_status = 1;
...
doSomething();
...
command_status = 2;
...
return 3;
}
cpp文件
void doSomethingManagedWrapper() {
...
call managed code
...
}
void doSomething() {
doSomethingManagedWrapper();
}
答案 1 :(得分:1)
在c ++ / cli模块中实现这些时,请使用c头文件中显示的相同签名,但前缀为extern "C"
。
还在C头文件的extern "C"
周围添加了#include
块。