问题描述
大家好,我是做C#的,项目用到一个C++的DLL,但是一直调用不到这个DLL的方法,后来听说这个DLL要加上_declspec,但有没有DLL的源码和lib,那我要怎么给它加?好像是要新建一个DLL,再调用原来的DLL,是吗,?怎么实现。
解决方案
解决方案二:
C#调用的话,没有lib没关系,但是要有函数原型定义。cdecl和stdcall都可以支持。
解决方案三:
O(∩_∩)O~http://www.cppblog.com/mzty/archive/2007/12/25/39610.htmlC#的Form通过CLI调用C++的DLL一方法C#的project调用C++的DLL,一般也有3中方法:1)最简单的方法,通过PInvoke,但是只能调用全局function,不能调用Class。2)通过COM封装调用。3)通过CLI作为中介,也即本文章所讲的。二实例1)假如我们有的Math的dll,classCPPDLL_APIMath{public:staticdoubleAdd(doublex,doubley);staticdoubleMultiply(doublex,doubley);};classCPPDLL_APIAdvancedMath{public:staticintFactorial(intx);};doubleMath::Add(doublex,doubley){returnx+y;}doubleMath::Multiply(doublex,doubley){returnx*y;}intAdvancedMath::Factorial(intx){if(x<=0)return0;if(1==x)return1;returnx*Factorial(x-1);}2)C++的MFC的Dialog调用(比较烦,特别是MFC的controls太少了。各种String间的转化也和累啊,我这里为了简化,不得不把vs05中默认的unicode改为非unicode)#pragmacomment(lib,"../debug/cppdll.lib")#include"../cppdll/cppdll.h"voidCCppTestDlg::OnBnClickedButton1(){switch(m_op){caseAdd:{CStringxStr;m_EditX.GetWindowText(xStr);CStringyStr;m_EditY.GetWindowText(yStr);doublex=atof(xStr);doubley=atof(yStr);doublesum=Math::Add(x,y);CStringsumStr;sumStr.Format("%f",sum);m_EditSum.SetWindowText(sumStr);break;}caseMultiply:{CStringxStr;m_EditX.GetWindowText(xStr);CStringyStr;m_EditY.GetWindowText(yStr);doublex=atof(xStr.GetBuffer());doubley=atof(yStr);doublesum=Math::Multiply(x,y);CStringsumStr;sumStr.Format("%f",sum);m_EditSum.SetWindowText(sumStr);break;}caseFactorial:{CStringxStr;m_EditX.GetWindowText(xStr);doublex=atoi(xStr);doublesum=AdvancedMath::Factorial(x);CStringsumStr;sumStr.Format("%f",sum);m_EditSum.SetWindowText(sumStr);break;}default:break;}}3)CLI的wrapper#pragmaonceclassMath;classAdvancedMath;namespaceCppMathLib{publicrefclassMathWrapper{public:staticdoubleAdd(doublex,doubley);staticdoubleMultiply(doublex,doubley);};publicrefclassAdvancedMathWrapper{public:staticintFactorial(intx);};}#include"stdafx.h"#include"MathWrapper.h"#pragmacomment(lib,"../debug/CppDLL.lib")#include"../CppDLL/cppdll.h"usingnamespaceCppMathLib;doubleMathWrapper::Add(doublex,doubley){returnMath::Add(x,y);}doubleMathWrapper::Multiply(doublex,doubley){returnMath::Multiply(x,y);}intAdvancedMathWrapper::Factorial(intx){returnAdvancedMath::Factorial(x);}4)C#的Form调用CLI的wrapperusingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;namespaceCsharpTest{enumOperation{Add,Multiply,Factorial,None}publicpartialclassForm1:Form{privateOperationop=Operation.None;publicForm1(){InitializeComponent();}privatevoidradioButtonMultiply_CheckedChanged(objectsender,EventArgse){op=Operation.Multiply;textBoxY.Enabled=true;}privatevoidradioButtonAdd_CheckedChanged(objectsender,EventArgse){op=Operation.Add;textBoxY.Enabled=true;}privatevoidradioButtonFactorial_CheckedChanged(objectsender,EventArgse){op=Operation.Factorial;textBoxY.Text="0";textBoxY.Enabled=false;}privatevoidbutton1_Click(objectsender,EventArgse){switch(op){caseOperation.Add:textBoxSum.Text=CppMathLib.MathWrapper.Add(Double.Parse(textBoxX.Text),Double.Parse(textBoxY.Text)).ToString();break;caseOperation.Multiply:textBoxSum.Text=CppMathLib.MathWrapper.Multiply(Double.Parse(textBoxX.Text),Double.Parse(textBoxY.Text)).ToString();break;caseOperation.Factorial:textBoxSum.Text=CppMathLib.AdvancedMathWrapper.Factorial(Int32.Parse(textBoxX.Text)).ToString();break;default:break;}}privatevoidbutton2_Click(objectsender,EventArgse){this.Close();}}}三截图比较前面的是C++的MFC的dialog,后面的C#的Form,看起来一样哦,就是开发速度不同!
解决方案四:
楼上的回答很详细了。就是的。一般都是写dllimport。写成函数。再调用。