Calling a C++ DLL from C#

本文关键字:from DLL C++ Calling | 更新日期: 2023-09-27 18:09:49

我正在制作一个程序来控制激光,但要做到这一点,我需要将dll导入c#并使用它调用函数。原来的程序是用c++写的,我就是不知道怎么做。所以我的问题是:

    如何在c#中导入dll如何在c#中调用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#中得到这个?

Calling a C++ DLL from C#

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

PInvoke是完美的。这里有一个很好的教程:点击。

你不能在你的项目设置中导入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++之间不同的数据类型(如字符串,对象等)时,它会变得更复杂,但本教程很好地涵盖了这些。