C#中调用C++ 动态链接库 dll 的方…
2014-09-25 13:28
197 查看
首先,c++的类在c#中是不兼容的,因此,c#只能够使用c++的导出函数,不能使用导出类(非常执着的去搞也是可以的,只是得不偿失,很困难)
其次,为了防止c++的编译器对c++函数命名方式进行改变,导出函数要用 extern "C"
来修饰,这个当然是众所周知的了
然后,要把一个函数指明是导出函数,要用 _declspec(dllexport)
来修饰
因此,一个完整的c++导出函数应该是这样的:
在c#中,首先要引用命名空间 using
System.Runtime.InteropServices;
.
然后使用 DllImport属性来声明一个外部函数,这个函数必须是静态的,因此,应该长成这个样子:
namespace ConsoleApplication1
{
class
Program
{
static void Main(string[] args)
{
Console.Write(mp(2, 3));
}
[DllImport("dll.dll", EntryPoint = "MyPlus")]
public static extern int mp(int a, int b);
}
}
先指定动态链接库名字,EntryPoint是c++中的函数名,mp是你在c#使用的函数名.
.
至此,你就可以随心所欲的使用这个函数了,是不是很简单?
.
如果非常想使用c++中的类,那么只能模仿c++编译器的技术,手动实现所谓的this指针,这个无非是语法糖
把对象的指针强制转换成int类型返回给c#,然后把c++里类的函数包装成一个外部函数,把对象指针以int形式传入
其次,为了防止c++的编译器对c++函数命名方式进行改变,导出函数要用 extern "C"
来修饰,这个当然是众所周知的了
然后,要把一个函数指明是导出函数,要用 _declspec(dllexport)
来修饰
因此,一个完整的c++导出函数应该是这样的:
extern "C" _declspec( dllexport ) int MyPlus( int a, int b) { return a+b; } |
在c#中,首先要引用命名空间 using
System.Runtime.InteropServices;
.
然后使用 DllImport属性来声明一个外部函数,这个函数必须是静态的,因此,应该长成这个样子:
namespace ConsoleApplication1
{
class
Program
{
static void Main(string[] args)
{
Console.Write(mp(2, 3));
}
[DllImport("dll.dll", EntryPoint = "MyPlus")]
public static extern int mp(int a, int b);
}
}
先指定动态链接库名字,EntryPoint是c++中的函数名,mp是你在c#使用的函数名.
.
至此,你就可以随心所欲的使用这个函数了,是不是很简单?
.
如果非常想使用c++中的类,那么只能模仿c++编译器的技术,手动实现所谓的this指针,这个无非是语法糖
把对象的指针强制转换成int类型返回给c#,然后把c++里类的函数包装成一个外部函数,把对象指针以int形式传入
相关文章推荐
- C#中调用C++ 动态链接库 dll 的方…
- 处理c#调用c++dll所引起的“找不到指定模块"和BadImageFormatException异常
- c#调用API 和c++dll的参数问题
- C#调用C++编写的COM DLL
- C# 中调用C++ DLL (P/Invoke)
- C#调用C++ DLL令人头痛的两件事
- C#调用C++编写的COM DLL
- 如何用C#调用C++开发的DLL呢?
- c#调用C++的DLL找不到入口点
- C#调用C++编写的COM DLL
- C#中调用C++的dll的参数为指针类型的导出函数
- C#调用C++编写的COM DLL封装库的问题解决方案
- 使用C++调用C#的DLL
- C#调用api,或C++生成的dll
- C#调用C++编写的COM DLL
- c#调用C++的DLL找不到入口点
- 在c#中调用c++生成的dll(wince开发)
- 在C#中调用C++写的DLL
- C# C++ dll的相互调用
- 使用C++调用C#的DLL(转载)