C#調用C++動態連接庫方法介紹 - 51CTO.COM

當VC等調用C#寫的COM時,用regasm   /tlb生成TLB文件,也可用tlbexp.exe,在VC等中加載TLB文件,當用C#調用VC等寫的COM時,用tlbimp.exe,你能夠寫一個程序調試一下函數

下面介紹C#調用C++動態連接庫方法。spa

添加System.Runtime.InteropServices命名空間調試

如是COM就直接用靜態函數調用:                   code

  
  1. public   static   int   GetNum(     
  2.                           int   lFileSeqNo,     
  3.                           string   sExtType,     
  4.                           string   sExtNumber,     
  5.                           string   sFormID,     
  6.                           string   sOperationDate,     
  7.                           string   sSystemRegistDate,     
  8.                           out   int   lCount,     
  9.                           out   int   lErrorType,     
  10.                           out   int   lErrorCode)     
  11.                   {     
  12.                           int   iRet;     
  13.       
  14.                           WOBCom.ObjClass   obj   =   new   WOBCom.ObjClass();     
  15.                               
  16.                           iRet   =   obj.GetNum(     
  17.                                   lFileSeqNo,     
  18.                                   sExtType,     
  19.                                   sExtNumber,     
  20.                                   sFormID,     
  21.                                   sOperationDate,     
  22.                                   sSystemRegistDate,     
  23.                                   out   lCount,     
  24.                                   out   lErrorType,     
  25.                                   out   lErrorCode);     
  26.       
  27.                           return   iRet;     
  28.                   }     

如不使COM是普通的DLL   orm

不能直接用   htm

只能在C++中加一個對外的接口:   接口

  
  1. extern   "C"   __declspec(dllexport)   WOExtConRegObj*   OutGetObjConstructor();     
  2. extern   "C"   __declspec(dllexport)   void   OutGetObjDestructor(WOExtConRegObj*   outGetObj);     
  3.       
  4. extern   "C"   __declspec(dllexport)   long   SelectDummyRecord(long   *lErrorType,     
  5.         long   *lErrorCode,     
  6.         WOExtConRegObj*   outGetObj);     
  7. //     
  8. extern   "C"   __declspec(dllexport)   WOExtConRegObj*   OutGetObjConstructor()     
  9. {     
  10.           WOExtConRegObj*   outGetObj   =   new   WOExtConRegObj();        
  11.           return   outGetObj;     
  12. }     
  13.       
  14. extern   "C"   __declspec(dllexport)   void   OutGetObjDestructor(WOExtConRegObj*   outGetObj)     
  15. {     
  16.           delete   outGetObj;     
  17. }     
  18.       
  19. extern   "C"   __declspec(dllexport)   long   SelectDummyRecord(long   *lErrorType,     
  20.         long   *lErrorCode,     
  21.         WOExtConRegObj*   outGetObj)     
  22. {     
  23. return   outGetObj->SelectDummyRecord(lErrorType,     
  24. lErrorCode);         
  25. }     

就可直接用C#調用C++動態連接庫了    rem

  
  1. [DllImport("XXX.dll", EntryPoint="SelectDummyRecord", ExactSpelling=false, CallingConvention=CallingConvention.Cdecl)]     
  2.  private   static   extern   int   SelectDummyRecord(out int lErrorType,out int lErrorCode,int outGetObj);     
  3.  
  4.  ///   < summary>     
  5.  ///   < /summary>     
  6.  ///   < remarks>     
  7.  ///   < /remarks>                     
  8.  ///   < param name="lErrorType">< /param>     
  9.  ///   < param name="lErrorCode">< /param>     
  10.  ///   < returns>< /returns>     
  11.  public int SelectDummyRecord(out int lErrorType,out int lErrorCode)     
  12.  {     
  13.          int   intRtn;     
  14.  
  15.          intRtn   =   SelectDummyRecord(     
  16.                  out   lErrorType,     
  17.                  out   lErrorCode,     
  18.                  m_OutGetObj);       
  19.          return   intRtn;     
  20.  }    

這樣就解決了C#調用C++寫的動態連接庫的問題。get




引文來源   C#調用C++動態連接庫方法介紹 - 51CTO.COM
相關文章
相關標籤/搜索