Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用C++;来自C的DLL#_C#_C++_Dll - Fatal编程技术网

C# 调用C++;来自C的DLL#

C# 调用C++;来自C的DLL#,c#,c++,dll,C#,C++,Dll,我正在制作一个控制激光的程序,但要做到这一点,我需要将一个dll导入c#并用它调用函数。原来的程序是用C++编写的,我就是不知道怎么做。 因此,我的问题是: 如何在c中导入dll# 如何在C++语言中调用C++中的函数 P>为了让它更清楚,我已经从C++程序中添加了代码。 #include "MarkEzdDll.h" class CDemoEzdDlg : public CDialog { // Construction public: CDemoEzdDlg(CWnd* pPar

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

  • 如何在c中导入dll#
  • 如何在C++语言中调用C++中的函数 <> P>为了让它更清楚,我已经从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++
    函数。)

    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()
    调用它。(您还需要在同一文件中使用System.Runtime.InteropServices;添加


    当然,当使用C和C++之间的数据类型(如字符串、对象等)时,它会变得更复杂。但是,教程很好地说明了。

    只是澄清,你想从C++代码中调用C++函数,还是想用C++代码调用C++方法?“定义C++方法”实际上你定义了C方法;普赖特,谢谢你!我已经编辑过了。:)谢谢你这对我很有帮助:)