从C#调用C++ DLL

3
我正在制作一个控制激光的程序,但为此需要将一个dll文件导入到C#中,并调用其中的函数。原始程序是用C++编写的,我无法弄清楚如何操作。
因此,我的问题是:
  1. 如何在C#中导入dll文件
  2. 如何从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#中如何实现这一点?

只是想澄清一下,您是想从C#代码调用C++函数,还是想从C++代码调用C#方法? - Justin
1个回答

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++之间差异的数据类型(例如字符串、对象等),就会变得更加复杂,但是本教程对此进行了很好的覆盖。


定义一个C++方法。实际上,您正在定义一个C方法; p - leppie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接