2011年12月19日 星期一

如何在Native Visual C++ (MFC)中呼叫使用Managed C++(CLR)的.dll

首先介紹CLR & MFCdll差別

CLR(Managed C++)
CLR開發出來的Dll需安裝.NET Framework才能跑,好處是可以使用.NET Framework函式庫寫出的Dll也可在Visual Studio直接加入參考使用。

MFC(Native Visual C++ plain C++)
MFC 開發出來的Dll則可以不需安裝.NET Framework,因此無法使用.NET Framework的函式庫,寫出的Dll也無法直接加入參考使用,則要用C語言的動態或靜態載入方式。
補充:
CLI又稱共同語言規範,用來定義.NET程式怎樣運作,CLRCLI規範的實做

動作步驟:


  • 由於ManagedDll必須要註冊才能使用
    • 按開始,由程式集進入Microsoft Visual Studio Visual Studio 2010 Tools
    • 開啟Visual Studio 2010 命令提示
    •  輸入managed DLL 所在的資料夾位置
    •  輸入
      • RegAsm.exe XXX.dll /tlb:XXX.tlb /codebase  如圖↓
  • 完成上面步驟則會產生.tlb
    • 補充:
      •  tlbCLR物件。因為tlb並不是C++標準的物件,必須編譯成標準的C++類型,使得C++開發者可以使用。 tlh表示(.h)  tli表示(.cpp)
      • 使用方法:
        • #import “XXX.tlb”,然後compiler,則會在debugrelease下面產生XXX.tliXXX.tlh物件。
  • 接著Native Visual C++必須支援CLR才可編譯。
  • 支援CLR流程:
    •  點擊Project,接者點擊 XXX Properties. (XXX 為你的專案名子)
    •  展開Configuration Properties,點擊 General.
    • 點擊 Common Language Runtime Support此欄框,選擇Old Syntax (/clr:oldSyntax),確定後按套用及確定。 如圖↓

  • 為了讓CLRBuild還必須加入一個reference (System.Windows.Forms)
    • 點擊Project,接者點擊 XXX Properties. (XXX 為你的專案名子)
    • 展開Comom Properties,點擊 Framework and References
    •  點擊Add New Reference,接著點擊Browse,加入System.Windows.Forms
    • System.Windows.Forms通常路徑為: C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Windows.Forms.dll
  • 完成此步驟後 ,接者在您的程式中加入#import指令並compiler 
  • #import "XXX.tlb" no_namespace, raw_interfaces_only
  • 之後會產生出的.tlh會在專案的debugrelease資料夾中。
  • 最後,在您的專案中加入#using <XXX.dll>  using namespace YYY; (YYYdllnamespace名稱),則可使用dll中的Device function寫入控制動作
  • 或是呼叫dll中直接設定參數的function,寫法如下: 
    • #include "stdafx.h"
      #include "tchar.h"
      // Import the type library.
       
      #import "..\ManagedDLL\bin\Debug\ManagedDLL.tlb" raw_interfaces_only
       
      //ManagedDLL為你dllnamespace的名稱
      using namespace ManagedDLL; 
      
      
      int _tmain(int argc, _TCHAR* argv[])
      {
          // Initialize COM.
          HRESULT hr = CoInitialize(NULL);
       
          // Create the interface pointer.
         //ManagedClass為你dllclass的名稱
          ICalculatorPtr pICalc(__uuidof(ManagedClass));
          
          long lResult = 0;
       
          //呼叫dll中的Add function
          pICalc->Add(5, 10, &lResult);
       
          wprintf(L"The result is %d\n", lResult);
       
          // Uninitialize COM.
          CoUninitialize();
          return 0;
      }
注意: 支援CLR會與OpenCV發生衝突,因此必須關掉OpenCV
附註: dll是由project產生出來的,所以必須要有它的原始碼,才會曉得如何使用它的function
想要更加了解可參考這網站:

沒有留言:

張貼留言