关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

C#中调用C++动态链接库方法有那些

发布时间:2020-02-05 18:54:50

当VC等调用C#写的COM时,用regasm   /tlb生成TLB文件,也可用tlbexp.exe,在VC等中加载TLB文件,当用C#调用VC等写的COM时,用tlbimp.exe,你可以写一个程序调试一下


下面介绍C#调用C++动态链接库方法。


添加System.Runtime.InteropServices命名空间


如是COM就直接用静态函数调用:                  



   


 

    

public   static   int   GetNum(     


 

    

                          int   lFileSeqNo,     


 

    

                          string   sExtType,     


 

    

                          string   sExtNumber,     


 

    

                          string   sFormID,     


 

    

                          string   sOperationDate,     


 

    

                          string   sSystemRegistDate,     


 

    

                          out   int   lCount,     


 

    

                          out   int   lErrorType,     


 

    

                          out   int   lErrorCode)     


 

    

                  {     


 

    

                          int   iRet;     


 

    

      


 

    

                          WOBCom.ObjClass   obj   =   new   WOBCom.ObjClass();     


 

    

                              


 

    

                          iRet   =   obj.GetNum(     


 

    

                                  lFileSeqNo,     


 

    

                                  sExtType,     


 

    

                                  sExtNumber,     


 

    

                                  sFormID,     


 

    

                                  sOperationDate,     


 

    

                                  sSystemRegistDate,     


 

    

                                  out   lCount,     


 

    

                                  out   lErrorType,     


 

    

                                  out   lErrorCode);     


 

    

      


 

    

                          return   iRet;     


 

    

                  }     



   

如不使COM是普通的DLL  


不能直接用  


只能在C++中加一个对外的接口:  



   


 

    

extern   "C"   __declspec(dllexport)   WOExtConRegObj*   OutGetObjConstructor();     


 

    

extern   "C"   __declspec(dllexport)   void   OutGetObjDestructor(WOExtConRegObj*   outGetObj);     


 

    

      


 

    

extern   "C"   __declspec(dllexport)   long   SelectDummyRecord(long   *lErrorType,     


 

    

        long   *lErrorCode,     


 

    

        WOExtConRegObj*   outGetObj);     


 

    

//     


 

    

extern   "C"   __declspec(dllexport)   WOExtConRegObj*   OutGetObjConstructor()     


 

    

{     


 

    

          WOExtConRegObj*   outGetObj   =   new   WOExtConRegObj();        


 

    

          return   outGetObj;     


 

    

}     


 

    

      


 

    

extern   "C"   __declspec(dllexport)   void   OutGetObjDestructor(WOExtConRegObj*   outGetObj)     


 

    

{     


 

    

          delete   outGetObj;     


 

    

}     


 

    

      


 

    

extern   "C"   __declspec(dllexport)   long   SelectDummyRecord(long   *lErrorType,     


 

    

        long   *lErrorCode,     


 

    

        WOExtConRegObj*   outGetObj)     


 

    

{     


 

    

return   outGetObj->SelectDummyRecord(lErrorType,     


 

    

lErrorCode);         


 

    

}     



   

就可直接用C#调用C++动态链接库了    



   


 

    

[DllImport("XXX.dll", EntryPoint="SelectDummyRecord", ExactSpelling=false, CallingConvention=CallingConvention.Cdecl)]     


 

    

 private   static   extern   int   SelectDummyRecord(out int lErrorType,out int lErrorCode,int outGetObj);     


 

    

 


 

    

 ///   < summary>     


 

    

 ///   < /summary>     


 

    

 ///   < remarks>     


 

    

 ///   < /remarks>                     


 

    

 ///   < param name="lErrorType">< /param>     


 

    

 ///   < param name="lErrorCode">< /param>     


 

    

 ///   < returns>< /returns>     


 

    

 public int SelectDummyRecord(out int lErrorType,out int lErrorCode)     


 

    

 {     


 

    

         int   intRtn;     


 

    

 


 

    

         intRtn   =   SelectDummyRecord(     


 

    

                 out   lErrorType,     


 

    

                 out   lErrorCode,     


 

    

                 m_OutGetObj);       


 

    

         return   intRtn;     


 

    

 }    



   

这样就解决了C#调用C++写的动态链接库的问题。



/template/Home/Zkeys/PC/Static