2013-04-17 331 views
3

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

  1. 如何导入一个dll在C#
  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#中获得此?

+0

为了澄清,你想从C#代码中调用C++函数,还是想从C++代码调用C#方法? – Justin

回答

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

+0

“定义一个C++方法”其实你正在定义一个C方法; p – leppie

+0

对,谢谢!我编辑过它。 :) –

+0

谢谢你,这可以帮助我很多:) –