动态调用差C++类库的方法(C#)

一开始“冰yi年华”老哥问我如何调用的时候,我随口一答:这个比较简单……
后来他告诉我:你的实例是C#调用C++的导出函数,不是导出类……
我想当然的回答:通俗的说,类不就是多个函数嘛,我马上写一个Demo给你……
结果被他言中,我失败了,找不到这个EntryPoint
后来他告诉我:C++不像C#那样支持映射,需要另行处理,于是我就开始百度,找了N久才成功,正好贴出来,留来后用。

首先我让老哥写了一段C++代码,如下

(需要自己写一个.h文件中 在文件里定义这个宏:#define TESTDLL_EXPORTS)

#ifdef TESTDLL_EXPORTS
#define TESTDLL_API __declspec(dllexport)
#else
#define TESTDLL_API __declspec(dllimport)
#endif

// 此类是从 testdll.dll 导出的
class TESTDLL_API Ctestdll {
public:
 Ctestdll(void);
 // TODO: 在此添加您的方法。

public:
 int Add(int a, int b) {return a+b;}
 int Sub(int a, int b) {return a-b;}
 int Mul(int a, int b) {return a*b;}
};

extern TESTDLL_API int ntestdll;

TESTDLL_API int fntestdll(void);

这里有一个class :Ctestdll,它有三个function:Add、Sub、Mul,通过使用uedit32查看到它对应的三个导出函数分别是
1、?Add@Ctestdll@@QAEHHH@Z
2、?Sub@Ctestdll@@QAEHHH@Z
3、?Mul@Ctestdll@@QAEHHH@Z

好了,现在开始做Demo了:

1、打开VS2008,建一个测试项目WindowsFormsApplication2;

2、将C++编译的testdll.dll放入bin/Debug(因为我用的是调试模式);

3、新建一个类库文件,内容如下

using System;
using System.Runtime.InteropServices;

namespace WindowsFormsApplication2
{
    class Ctestdll
    {
        [DllImport("testdll.dll", EntryPoint = "
?Add@Ctestdll@@QAEHHH@Z", CharSet = CharSet.Auto)]
        private static extern int Add(int a, int b);
        public int myAdd(int a, int b)
        {
            return Add(a, b);
        }
        [DllImport("testdll.dll", EntryPoint = "
?Sub@Ctestdll@@QAEHHH@Z", CharSet = CharSet.Auto)]
        private static extern int Sub(int a, int b);
        public int mySub(int a, int b)
        {
            return Sub(a, b);
        }
        [DllImport("testdll.dll", EntryPoint = "
?Mul@Ctestdll@@QAEHHH@Z", CharSet = CharSet.Auto)]
        private static extern int Mul(int a, int b);
        public int myMul(int a, int b)
        {
            return Mul(a, b);
        }
    }
}

4、建一个Form  拖放三个TextBox 和三个Button

5、双击Button,写入如下代码

        private void button1_Click(object sender, EventArgs e)
        {
            Ctestdll test = new Ctestdll();
            this.textBox3.Text = test.myAdd(Convert.ToInt32(this.textBox1.Text), Convert.ToInt32(this.textBox2.Text)).ToString();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Ctestdll test = new Ctestdll();
            this.textBox3.Text = test.mySub(Convert.ToInt32(this.textBox1.Text), Convert.ToInt32(this.textBox2.Text)).ToString();

        }

        private void button3_Click(object sender, EventArgs e)
        {
            Ctestdll test = new Ctestdll();
            this.textBox3.Text = test.myMul(Convert.ToInt32(this.textBox1.Text), Convert.ToInt32(this.textBox2.Text)).ToString();

        }

6、启动调试(或按F5),尝试三个按钮的功能;



 

7、调试成功。到此C#调用C++导出类的实例结束了,整个实例 关键是找到对应的每个导出函数。

实例代码:
点击下载(119.6 KB)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CSharp 调用C++ DLL; 参数为指针类型导出函数 c# Csharp调用 c++库 参数为导入和导出指针两种 包含C++ DLL源码 如fun(cont char* A,char*B) A为输入参数,B为输出参数-C# CSharp call C++ DLL lib dll function param use export and import eg: fun(cont char* A,char*B) A IN,B OUT TestDll\Debug\TestCallDll.exe .......\.....\TestCallDll.vshost.exe .......\.....\TestCallDll.vshost.exe.manifest .......\.....\TestDll.dll .......\.....\TestDll.lib .......\TestCallDll\Form1.cs .......\...........\Form1.Designer.cs .......\...........\Form1.resx .......\...........\obj\Debug\TestCallDll.csproj.FileListAbsolute.txt .......\...........\...\.....\TestCallDll.csproj.GenerateResource.Cache .......\...........\...\.....\TestCallDll.exe .......\...........\...\.....\TestCallDll.Form1.resources .......\...........\...\.....\TestCallDll.pdb .......\...........\...\.....\TestCallDll.Properties.Resources.resources .......\...........\Program.cs .......\...........\...perties\AssemblyInfo.cs .......\...........\..........\Resources.Designer.cs .......\...........\..........\Resources.resx .......\...........\..........\Settings.Designer.cs .......\...........\..........\Settings.settings .......\...........\TestCallDll.csproj .......\....Dll\dllmain.cpp .......\.......\ReadMe.txt .......\.......\stdafx.cpp .......\.......\stdafx.h .......\.......\targetver.h .......\.......\TestDll.cpp .......\.......\TestDll.def .......\.......\TestDll.h .......\.......\TestDll.vcproj .......\.......\TestDll.vcproj.PC-201008261742.Administrator.user .......\TestDll.sln .......\TestDll.suo .......\....CallDll\obj\Debug\TempPE .......\...........\...\Debug .......\...........\obj .......\...........\Properties .......\Debug .......\TestCallDll .......\TestDll TestDll

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值