DLL创建与调用(C#调用C++的DLL)
1、C++中需要导出的函数,函数定义处在返回值前加上:extern "C" __declspec(dllexport)
C#调用:[DllImport("导出函数所在DLL名", EntryPoint = "函数名")]
static extern unsafe 函数定义
代码示例:
C++导出: #define DllExport extern "C" __declspec(dllexport)
DllExport void __stdcall GetVersion_SW(char* pVersion) { ……函数定义 }
C# 调用: [DllImport("DllExportDemo.dll", EntryPoint = "GetVersion_SW")]
static extern unsafe void GetVersion(char* pVersion);
unsafe
{
IntPtr pStr = Marshal.AllocHGlobal(100);
GetVersion((char*)pStr);
string VersionStr = new string((SByte*)pStr);
Marshal.FreeHGlobal(pStr);
}
2、C++中需要导出的类,类定义处在类名前加上:__declspec(dllexport)
C++调用:加入导出类所在头文件和导出类所在DLL的静态库文件(DLL名.lib)
使用处引用该头文件后,和普通类一样使用。
注:C#不能直接使用DLL中导出的C++类
代码示例:
C++导出: #define DllExport __declspec(dllexport)
class DllExport MyClass
{
public:
MyClass();
~MyClass();
void Show();
private:
};
C++调用: #include "MyClass.h" (MyClass类定义所在头文件)
MyClass* testClass = new MyClass();
testClass->Show();
3、注意点:
(1)、函数参数类型需按照所占位数一 一对应:
例:C#中的ulong对应C++中的ULONG64,而非ULONG。
注:原因是C++中long、int等类型的长度和平台相关,C#中的long、int等类型是固定长度。
最新文章
- Ubuntu 16.04 几个国内更新源
- Greedy:Linear world(POJ 2674)
- Spark RDD操作(1)
- java--依赖、关联、聚合和组合之间区别的理解
- Java笔记(二十五)……其他常用API
- poj 2975 Nim(博弈)
- Notepad++中查找替换回车符
- redis在Java web项目的简单应用(转载)
- Freemarker常用技巧(三)
- ucenter 通信原理个人总结
- C# Winform中DataGridView的DataGridViewCheckBoxColumn CheckBox选中判断
- SQL SERVER中如何格式化日期(转)
- C#:判断当前程序是否通过管理员运行
- 关于v-model、v-for、v-on的用法
- [刷题]算法竞赛入门经典(第2版) 4-8/UVa12108 - Extraordinarily Tired Students
- Linux学习--进程概念
- Java基础系列--04_数组
- springmvc ajax tomcat简单配置实现跨域访问
- C#虚函数virtual详解
- ibatis实战之插入数据(自动生成主键)