C#调用C、C++的DLL

来源:互联网 发布:idownload mac 编辑:程序博客网 时间:2024/06/05 14:24

整理的部分资料,发现可用在C#调用C、C++中的方法和类,不过比较绕,而且不太好写。调试也很多没通过,先做个备忘,以后再来研究。


//自定义类别的头文件 WebICAdapter.h#ifdef DLL_API#else#define DLL_API extern "C" __declspec(dllexport)#endifclass 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 onceclass 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[]之间的转换


0 0