一 方法
C#的project调用C++的DLL,一般也有3中方法:
1)最简单的方法,通过PInvoke,但是只能调用全局function,不能调用Class。
2)通过COM封装调用。
3)通过CLI作为中介,也即本文章所讲的。
二 实例
1)假如我们有的Math的dll,
class CPPDLL_API Math
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
public:
static double Add(double x, double y);
static double Multiply(double x, double y);
};
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
class CPPDLL_API AdvancedMath
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
public:
static int Factorial(int x);
};
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
double Math::Add(double x, double y)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
return x + y;
}
double Math::Multiply(double x, double y)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
return x * y;
}
int AdvancedMath::Factorial(int x)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
if(x <= 0)
return 0;
if(1 == x)
return 1;
return x * Factorial(x - 1);
}
2)C++的MFC的Dialog调用(比较烦,特别是MFC的controls太少了。各种String间的转化也和累啊,我这里为了简化,不得不把vs05中默认的unicode改为非unicode)
#pragma comment(lib,"../debug/cppdll.lib")
#include "../cppdll/cppdll.h"
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
void CCppTestDlg::OnBnClickedButton1()
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
switch(m_op)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
case Add:
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
CString xStr;
m_EditX.GetWindowText(xStr);
CString yStr;
m_EditY.GetWindowText(yStr);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
double x = atof(xStr);
double y = atof(yStr);
double sum =Math::Add(x, y);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
CString sumStr;
sumStr.Format("%f",sum);
m_EditSum.SetWindowText(sumStr);
break;
}
case Multiply:
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
CString xStr;
m_EditX.GetWindowText(xStr);
CString yStr;
m_EditY.GetWindowText(yStr);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
double x = atof(xStr.GetBuffer());
double y = atof(yStr);
double sum = Math::Multiply(x, y);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
CString sumStr;
sumStr.Format("%f",sum);
m_EditSum.SetWindowText(sumStr);
break;
}
case Factorial:
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
CString xStr;
m_EditX.GetWindowText(xStr);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
double x = atoi(xStr);
double sum = AdvancedMath::Factorial(x);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
CString sumStr;
sumStr.Format("%f",sum);
m_EditSum.SetWindowText(sumStr);
break;
}
default:
break;
}
}
3)CLI的wrapper
#pragma once
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
class Math;
class AdvancedMath;
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
namespace CppMathLib
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
public ref class MathWrapper
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif)
{
public:
static double Add(double x, double y);
static double Multiply(double x, double y);
};
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
public ref class AdvancedMathWrapper
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif)
{
public:
static int Factorial(int x);
};
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#include "stdafx.h"
#include "MathWrapper.h"
#pragma comment(lib, "../debug/CppDLL.lib")
#include "../CppDLL/cppdll.h"
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
using namespace CppMathLib;
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
double MathWrapper::Add(double x, double y)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
return Math::Add(x, y);
}
double MathWrapper::Multiply(double x, double y)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
return Math::Multiply(x,y);
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
int AdvancedMathWrapper::Factorial(int x)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
return AdvancedMath::Factorial(x);
}
4)C#的Form调用CLI的wrapper
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
namespace CsharpTest
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
enum Operation
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Add,
Multiply,
Factorial,
None
}
public partial class Form1 : Form
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
private Operation op = Operation.None;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
public Form1()
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
InitializeComponent();
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
private void radioButtonMultiply_CheckedChanged(object sender, EventArgs e)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
op = Operation.Multiply;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
textBoxY.Enabled = true;
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
private void radioButtonAdd_CheckedChanged(object sender, EventArgs e)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
op = Operation.Add;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
textBoxY.Enabled = true;
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
private void radioButtonFactorial_CheckedChanged(object sender, EventArgs e)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
op = Operation.Factorial;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
textBoxY.Text = "0";
textBoxY.Enabled = false;
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
private void button1_Click(object sender, EventArgs e)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
switch(op)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
case Operation.Add:
textBoxSum.Text = CppMathLib.MathWrapper.Add(Double.Parse(textBoxX.Text), Double.Parse(textBoxY.Text)).ToString();
break;
case Operation.Multiply:
textBoxSum.Text = CppMathLib.MathWrapper.Multiply(Double.Parse(textBoxX.Text), Double.Parse(textBoxY.Text)).ToString();
break;
case Operation.Factorial:
textBoxSum.Text = CppMathLib.AdvancedMathWrapper.Factorial(Int32.Parse(textBoxX.Text)).ToString();
break;
default:
break;
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
private void button2_Click(object sender, EventArgs e)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.Close();
}
}
}
三 截图比较
![](http://www.cppblog.com/images/cppblog_com/mzty/2021/o_dialog.jpg)
![](http://www.cppblog.com/images/cppblog_com/mzty/2021/o_form.jpg)
前面的是C++的MFC的dialog,后面的C#的Form,看起来一样哦,就是开发速度不同!
四 代码下载:
http://www.cppblog.com/Files/mzty/CsharpCallCppByCLI.rar