整理的部分资料,发现可用在C#调用C、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);
}
//-------------头文件
#pragma once
class testclass
{
public:
testclass(void);
~testclass(void);
public:
WCHAR* GetName(void);
};
//-------------CPP
#include "StdAfx.h"
#include "testclass.h"
testclass::testclass(void)
{
}
testclass::~testclass(void)
{
}
WCHAR* testclass::GetName(void)
{
return NULL;
}
//--------------接口头文件
#pragma once
#include "testclass.h"
class Insertface
{
public:
Insertface(void);
~Insertface(void);
public:
void* CreateTextClass(void);
WCHAR* GetName(void *textClass);
BOOL DeleteTextClass(void *textClass);
};
//----------------------CPP
#include "StdAfx.h"
#include "Insertface.h"
Insertface::Insertface(void)
{
}
Insertface::~Insertface(void)
{
}
extern "C" _declspec(dllexport) void* Insertface::CreateTextClass(void)
{
testclass *p = new testclass();
return (void *)p;
}
extern "C" _declspec(dllexport) WCHAR* Insertface::GetName(void *textClass)
{
return ((testclass *)textClass)->GetName();
}
extern "C" _declspec(dllexport) BOOL Insertface::DeleteTextClass(void *textClass)
{
delete (testclass *)textClass;
return TRUE;
}
//----------------------C#
//C#代码我就不写了,在C#使用long类型来接受void *。指针就被C#记录了,在C++使用dllexport开放类的方法,这样C#就可以使用C++里的类。目前我是这样用的~不知道是不是您要的。。还有如果是C++定义的结构,C#定义一样相同的就可以互相使用了。
其它参考连接:C#调用C++Dll中的类