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 をインポートしません。代わりに、ソース コードから呼び出します。.exeもちろん、DLL がプロジェクトの出力 ( ) ファイルと同じフォルダーにあることを確認する必要があります。

一言で言えば、次のような 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 に答える