从C#调用C ++ DLL

时间:2013-04-17 08:24:28

标签: c# c++ dll

我正在制作一个控制激光的程序,但要做到这一点,我需要将一个dll导入c#并用它调用函数。原始程序是用C ++编写的,我只是想弄清楚如何做到这一点。 所以我的问题是:

  1. 如何在c#
  2. 中导入dll
  3. 如何在c#
  4. 中调用C ++中的函数

    为了让您更清楚,我已经添加了C ++程序中的代码。

    #include "MarkEzdDll.h"
    
    class CDemoEzdDlg : public CDialog
    {
    // Construction
    public:
        CDemoEzdDlg(CWnd* pParent = NULL);  // standard constructor
    
        HINSTANCE m_hEzdDLL;//DLLµ÷Óþä±ú
    
        LMC1_INITIAL       lmc1_Initial;
        LMC1_CLOSE         lmc1_Close;
        LMC1_LOADEZDFILE   lmc1_LoadEzdFile;
        LMC1_MARK          lmc1_Mark;
        LMC1_MARKENTITY    lmc1_MarkEntity;
        LMC1_GETPREVBITMAP lmc1_GetPrevBitmap;
    
        LMC1_READPORT  lmc1_ReadPort;
        LMC1_WRITEPORT lmc1_WritePort;
    
        LMC1_SETDEVCFG     lmc1_SetDevCfg; 
        LMC1_SETHATCHPARAM lmc1_SetHatchParam;
        LMC1_SETFONTPARAM  lmc1_SetFontParam;
        LMC1_GETPENPARAM   lmc1_GetPenParam;
        LMC1_SETPENPARAM   lmc1_SetPenParam;
        LMC1_CLEARENTLIB   lmc1_ClearEntLib;
        LMC1_ADDTEXTTOLIB  lmc1_AddTextToLib;
        LMC1_ADDFILETOLIB  lmc1_AddFileToLib;
        LMC1_ADDBARCODETOLIB   lmc1_AddBarCodeToLib;
        LMC1_CHANGETEXTBYNAME  lmc1_ChangeTextByName;
        LMC1_AXISMOVETO        lmc1_AxisMoveTo; 
        LMC1_AXISCORRECTORIGIN lmc1_AxisCorrectOrigin;  
        LMC1_GETAXISCOOR       lmc1_GetAxisCoor;
        LMC1_SAVEENTLIBTOFILE  lmc1_SaveEntLibToFile;
    
    在对话框中,有一个按钮,上面附有此代码:

    void CDemoEzdDlg::OnButtonRun() 
    {
        // TODO: Add your control notification handler code here
        UpdateData();
    
        if(lmc1_Mark==NULL)
        {
            return;
        }
    
    
        lmc1_Mark(FALSE);
        UpdatePrevBmp();
        AfxMessageBox(_T("Mark file finish!")); 
    }
    

    这是激光应该开始的时候。

    如何在c#中获取此内容?

1 个答案:

答案 0 :(得分:4)

(从你的帖子中发现不太清楚,但我猜你想从你的C++代码中调用C#个函数。)

PInvoke非常适合这一点。这是一个很好的教程:click

您不在项目设置中导入DLL;而是从源代码中调用它。当然,您必须确保DLL与项目的输出(.exe)文件位于同一文件夹中。

简而言之,如果您在foo.dll中定义这样的C方法:

extern "C" __declspec(dllexport) bool __stdcall GetTrue()
{
    return true;
}

然后您的C#程序可以这样声明:

[DllImport("foo.dll")]
static public extern bool GetTrue();

并简单地使用GetTrue()来调用它。 (您还需要在同一文件中添加using System.Runtime.InteropServices;

当你使用C#和C ++之间不同的数据类型(比如字符串,对象等)时,它会变得更复杂,但是教程很好地介绍了它。