C#调用C、C++的DLL

整理的部分资料,发现可用在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中的类

平台调用技术(P/Invoke)

string 与char* char[]之间的转换


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值