由于公司要重新编写产品界面,要求用.net来编写,但是底层用以前C++编写的代码,小弟从来没有接触过C#的东西,在过程中遇到了C++与C#相互访问的问题,现在有一个问题希望知道的朋友不吝赐教:1.我现在有一个C++编写的Dll(TESTCSharp.dll),里面有一个extern "C" __declspec(dllexport) int mySum((*void)TestFun(CString str))函数,mySum这个函数我在C#用静态加载Dll的方式已经调用出来,而参数TestFun这个函数是C#中的一个委托,委托调用的是C#的一个功能函数;2.我在C#(namespace WindowsApplication)中调用c++里面用[DllImport]的方法,调用mySum这个函数,并把委托TestFun作为参数传递到C++里,从而实现C++回调C#函数的目的.但是现在遇到的问题是,我不知道如何在C++中包含这个委托,让编译器识别到它不报错出来.
附:不知道各位朋友在用C++调用C#定义的回调函数时通常是怎么做的,我这个方法是否能行?请熟手指点迷津,小弟是初学者,又单位有时间要求,所以希望能有例子讲解,email:[email protected],小弟不胜感激.
附:不知道各位朋友在用C++调用C#定义的回调函数时通常是怎么做的,我这个方法是否能行?请熟手指点迷津,小弟是初学者,又单位有时间要求,所以希望能有例子讲解,email:[email protected],小弟不胜感激.
解决方案 »
- C#如何读取带密码的Excel文件
- ajax控件ValidatorCalloutExtender 气泡弹出方向问题!
- 谁能帮我把下面的xml的Node Name 依次递归到treeview的树上去?谢谢了
- 自己通过httpwebrequest类做了个灌水机,但程序运行起来超卡
- 请教高手:这是代码是什么语言,关于算法和数据结构
- 关于文件更新的问题
- 请教 ADO.net 问题 SqlDataAdapter 的 InsertCommand 用法
- 请教大家一些基础的问题,麻烦帮我解答一下
- 怎样才能在一个网页打开时就能看到从数据库中取出的数据(在线)
- 急!现在想创建一个可选字体的下拉列表,可选字体集可以从哪里获取吗?谢谢
- 如何通过ComboBox过滤DataGridView中显示的数据
- lock 挂起疑问
在C++里,就是调用那个函数指针,没有什么委托。
那我在调用的时候用char*,另外我想请教一下soaringbird, 我该如何在C++该如何写代码才能让C++工程识别到C#定义的类型或者方法.
soaringbird,你好:
这篇帖子描述的是如何设置C++ Dll外调函数参数的问题,我现在是C++的文件在编译的时候报错,因为C++不能识别到C#代码中定义的委托,C++调用C++的代码是需要#include "某个头文件",然后就可以使用头文件中定义的变量或者方法, 如果要让C++识别到C#中定义的方法,是不是需要用using namespace ""引用我C#的命名空间,""中是不是应该怎么些,添加了命名空间是不是就可以使用C#定义的东西了.
备注:我的C#没有生成dll,只有一个winform的exe程序
小弟才接触C#几天,麻烦soaringbird大哥说明下,谢谢了.在线等
谢谢soaringbird大哥,如果TestFun不带参数能够O了,先上分了,另有一个问题请教,一旦加入参数就报错,我的参数仅仅就是一个字符串,请大哥看看.
C#代码如下:
定义委托
delegate void TestFun(string strTst);然后
TestFun _test = new TestFun(CallBackFun);
IntPtr pCallBack = Marshal.GetFunctionPointerForDelegate(_test);
mySum(pCallBack);
public static void CallBackFun(string input)
{
MessageBox.Show(input);
}C++代码
extern "C" __declspec(dllexport) int mySum(void(*TestFun)char* pstr)) //这个地方在编译的时候报错 'pstr' : undeclared identifier
{
TestFun(pstr);
return 0;
}
是我在发帖的时候编辑错了,代码是
extern "C" __declspec(dllexport) int mySum(void(* TestFun)(char* pstr)),是按照网上的一个例子写的.
int mySum(void(* TestFun)(char* pstr),char*pstr)。这两个pstr不是一回事的。
定义委托
delegate void TestFun(string strTst); 然后
class Main
{
//...其他代码略过
[DllImport("TESTCSharp.dll")]
public static extern int mySum(IntPtr pKines);
TestFun _test = new TestFun(CallBackFun);
IntPtr pCallBack = Marshal.GetFunctionPointerForDelegate(_test);
mySum(pCallBack); //返回过来的时候出错
}public static void CallBackFun(string input)
{
MessageBox.Show(input); //这个函数被调用了2次
} C++代码
extern "C" __declspec(dllexport) int mySum(void(*TestFun)(char* pstr)){
TestFun("传入了自定义的字符串");
return 0;
}请问下,是不是调用了回调函数需要马上释放内存里面的东西,该如何释放?