C#Stimulator项目>>>C/C++ DLL的生成和调用,Windows下的多线程

Windows下的多线程

http://blog.csdn.net/ganpengjin1/article/category/2541791

使用C/C++建立DLL,环境VS2013

新建Win32工程,下一步,类型选择DLL

选中导出符号。不选空项目,让系统生成所需文件。

为了生成和使用的项目使用同一组头文件,一般使用这样的:

#ifdef MYLIB_EXPORTS
#define MYLIB_API __declspec(dllexport)
#else
#define MYLIB_API __declspec(dllimport)
#endif

MYLIB_API的位置:在class 后面,类名的前面

对于函数,申明和实现,在返回类型前面

对于全局变量,在extern后面,在变量类型前面。

DLL中使用回调函数。

在头文件中申明,比如 typedef  void (CALLBACK *yourfn)(int para);

在CPP中,一个初始化函数接受yourfn类型的函数指针

比如 :init(yourfn fn)

{

......

fn();//调用fn

}

外部模块调用DLL的时候,需要写一个类似yourfn的函数,

void myfn(int hi){......}

然后调用init(myfn);

C#调用DLL中的C函数

建立一个static类,

 using System.Runtime.InteropServices;

调用形式

或者这样的:

 [DllImport("dlldemo.dll", EntryPoint = "PassString", CharSet = CharSet.Ansi,  
                    CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]  
        public static extern int PassString(string msg);  
  
 [DllImport("dlldemo.dll", EntryPoint = "Power", CharSet = CharSet.Ansi,  
                    CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]  
        public static extern double Power(double x, int y);  

在C#修饰符 ref 即表示“传址”,所以C++中的 int*对应于 C#中的ref int

传递数组:

在C++中添加函数

这样调用

 C#调用DLL中C 回调函数

如果dll需要一个函数指针作为参数,你可以把一个c#的委托传给它,注意参数返回值对应就行

C#在调用时需要将委托声明为静态的类成员变量。因为委托是托管代码,会被垃圾回收机制回收,

 如果该回调需要数组传参数,还需注意:

public delegate void CallbackDelegate([marshalAs(UnmanagedType.LPArray,SizeConst=8010)]byte[] buffer,int count); 
原文地址:https://www.cnblogs.com/legion/p/6265031.html