C#调用C++的dll的问题?

使用的工具是VS2010哦~其他工具暂时还没试过

我新建的工程名是my21dll,所以会生成2个同名文件。接下来需要改动的只有画横线的部分

下面的1是自动生成的不用动,或者也可以不要,因为只是一个宏而已下面可以做相应修改。

下面的2是自动生成的类,我没用就注释掉了

下面的3是自动生成的一个测试函数,原来函数最前面是extern,记住精髓是要改成EXTERN_C 

下面的4是我自己写的一个测试函数,用来求和

 号3对应上面号3的函数,号4对应上面号4对应的函数。

下面是生成dll,两个红线的都可以

然后就可以在DeBug文件夹下看到dll了(~ ̄▽ ̄)~

再创建一个c#的控制台程序调用看看吧

我那是两个分开的函数,所以每一个都要写一个DllImport和extern static来声明,然后下面就可以像调用普通函数一样调用了。

后来我又测试了一下,假如c#中调用的c++函数里调用了c++里的其他函数,里面套用的那些函数也需要声明吗?

又把.cpp文件里函数做了相应修改

c#的函数也只声明了Add函数,看看行不行~

结果,没问题,成功了,说明只要最终在c#中显示出来的函数进行了声明就可以了,而且那些被调用的函数也可以像普通函数那样去写,只有不要export的函数写上输出的声明就可以了(^-^)V

}

C#,.Net,Web前端。在一家公司从事C#开发,个人博客

}

在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使用一些第三方通讯组件的时候,通过C#来开发应用软件时,就需要利用DllImport特性进行方法调用。本篇文章将引导你快速理解这个调用的过程。

3. 在Windows桌面项目中,选择“动态链接库DLL”,其他按照默认选项:

最后点击确定,得到如图所示项目:

我们可以看到这里有一些文件,其中dllmain.cpp作为定义DLL应用程序的入口点,它的作用跟exe文件有个main或者WinMain入口函数是一样的,它就是作为DLL的一个入口函数,实际上它是个可选的文件。它是在静态链接时或动态链接时调用LoadLibrary和FreeLibrary时都会被调用。详细内容可以参考()。

现在我们加入以下内容:

extern "C" 包含双重含义,从字面上即可得到:首先,被它修饰的目标是“extern”的;其次,被它修饰的目标是“C”的。而被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。

我们用反编译工具PE Explorer查看下该DLL里面的方法:

可以发现对外的公共函数上包含这四种“加减乘除”方法。

8. 另外,记得把CPPDemo中生成的DLL文件拷贝到CSharpDemo的bin目录下,你也可以通过设置【项目属性】->【配置属性】->【常规】中的输出目录:

这样编译项目后,生成的文件就自动输出到CSharpDemo中了。

9. 然后在Main入口编写测试代码:

A.调试时出现异常 :

签名的调用约定和参数与非托管的目标签名是否匹配。”

10. 以上的方法只能通过静态方法对于C++中的函数进行调用。那么怎样通过静态方法去调用C++中一个类对象中的方法呢?现在我在CPPDemo项目中添加一个头文件userinfo.h:

这里声明一个结构,包括name和age,这个结构是用于和C#方面的结构作个映射。

注意:代码中的User*是个指针,返回也是一个对象指针,这样做为了防止方法作用域结束后的局部变量的释放。

其中这里的结构User就和C++中的User对应。

注意:红色字体部分,这里结构指针首先转换成IntPtr句柄,然后通过Marshal.PtrToStructrue转换成你所需要的结构。

最后附上我的源代码:,希望对大家有所帮助:)

}

我要回帖

更多关于 内核函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信