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# 中得到这个?

4

1 回答 1

4

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

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

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

简而言之,如果您在以下位置定义这样的 C 方法foo.dll

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++ 之间不同的数据类型(如字符串、对象等)时,它会变得更加复杂,但本教程很好地涵盖了这一点。

于 2013-04-17T08:45:34.157 回答