C#语言使用方便,入门门槛较代,上手容易,并且语法与C,java有很类似的地方,IDE做的也好,通用性好,是MS下一代开发的主要力量.但是其开源代码较少,类库不是十分完美,在架构方面还有一些需要做的工作.
C++写的程序占用内存较小,直接对内存或者文件操作,因此一些关键的步骤或者一些最内层的循环在一定程序上还需要依赖C++.
下面我做一些简单的例子
第一步,用C++做一个可以导出函数的dll(不采用def文件)
cxyMath.h
//在这里定义导出哪一些函数
class MyMathFuncs
{
public:
// Returns a + b
static __declspec(dllexport) double Add(double a, double b);
// Returns a - b
static __declspec(dllexport) double Subtract(double a, double b);
// Returns a * b
static __declspec(dllexport) double Multiply(double a, double b);
// Returns a / b
// Throws DivideByZeroException if b is 0
static __declspec(dllexport) double Divide(double a, double b);
};
cxyMath.cpp的实现就很简单了,代码附在上传的文件中,在这里就不贴代码了,编译成dll后,拷贝dll,lib文件到C#的工程中的debug的目录下(如果你写的是release版,请将dll,lib拷贝到relase文件夹下)
第二步:找出导出的函数名写成如下形式,方便CS的调用
不采用def文件导出的函数名有些奇怪,但还是可以看出函数的层次,?函数名@类名@命名空间@@******,
找函数名可以使用ultraedit32,打开lib文件,就可看到了,如 __imp_?multiply@myMath@@SAHHH@Z,在_imp_ 后面的即为函数名。
[DllImport("cppdll.dll",EntryPoint="?Divide@MyMathFuncs@MathFuncs@@SANNN@Z",CharSet = CharSet.Auto)]
public static extern double Divide(double a,double b);
[DllImport("cppdll.dll",EntryPoint="?Multiply@MyMathFuncs@MathFuncs@@SANNN@Z",CharSet = CharSet.Auto)]
public static extern double Multiply(double a,double b);
第三步,调用
private void button1_Click(object sender, System.EventArgs e)
{
MessageBox.Show(Multiply(12,13).ToString());
}
示例程序在此处下载:
http://download.csdn.net/detail/diyoosjtu/4474515