#include "stdio.h"
__declspec(dllexport) void MyFun()
{
printf("this is a dll\n");
}
保存,取名为My.C
运行 VS 命令提示,Cl /c 路径/My.c
运行以后会生成 My.Obj,默认在vs安装文件夹的VC目录下
再运行 link/dll 路径/My.obj
在同一个目录会生成My.dll
在C#中调用:
将dll复制到bin目录,编写如下C#代码:
//注意要加上下面这个引用
using System.Runtime.InteropServices;
static void Main(string[] args)
{
MyFun();
}
[DllImport("My.dll")]
public extern static void MyFun();
运行成功,一年前的愿望终于实现。加油!
------------------------------------------------------------
以上是C#调用c的函数,以下是C#调用C++的类
------------------------------------------------------------
感谢xinen8721同学,项目需要今天参考了本文测试通过的代码。
C++定义:
//自定义类别的头文件 WebICAdapter.h
#ifdef DLL_API
#else
#define DLL_API extern "C" __declspec(dllexport)
#endif
class WebICAdapter
{
public:
WebICAdapter(void);
~WebICAdapter(void);
// 测试add函数
int add(int p1, int p2);
};
// 返回类别的实例指针
DLL_API void* classInit(void **clsp);
DLL_API int add(WebICAdapter* p, int p1, int p2);
//自定义类别的头文件 WebICAdapter.cpp
//=========导出函数============
// 返回类别的实例指针
void* classInit(void **clsp)
{
WebICAdapter* p = new WebICAdapter();
*clsp = p;
return clsp;
}
int add(WebICAdapter* p, int p1, int p2)
{
return p->add(p1,p2);
}
//==========类别实现===========
WebICAdapter::WebICAdapter(void)
{
}
WebICAdapter::~WebICAdapter(void)
{
}
// 测试add函数
int WebICAdapter::add(int p1, int p2)
{
return p1+p2;
}
C#定义和调用:
using System.Runtime.InteropServices;
......
//--------------DLL接口定义-----------
[DllImport("SWWebICAdapter.dll", EntryPoint = "classInit", CharSet =
CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int classInit(ref int clsPoint);
[DllImport("SWWebICAdapter.dll", EntryPoint = "add", CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall)]
public static extern int add(ref int clsPoint, int p1, int p2);
// DLL中的类实例指针
private int _clsPoint = 0;
// -----------------------------------
public SWWebIC()
{
InitializeComponent();
// 初始化DLL类实例
_clsPoint = classInit(ref _clsPoint);
}
......
private void buttonDevice_Click(object sender, EventArgs e)
{
int n = add(ref _clsPoint, 11, 12);
MessageBox.Show("计算结果:" + n);
}
调试的时候报错:
unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.
参考
C#中调用C++生成的dll出错,请教请教!解决错误
-
__cdecl,__stdcall 两者的堆栈清理者是不同的
-
__cdecl,__stdcall 两者的堆栈清理者是不同的