c#中如何调用vc++写的动态链接库

本文介绍了如何在C#中调用VC++编写的动态链接库(DLL)。首先,当VC调用C# COM组件时,可以使用regasm/tlb或tlbexp.exe。对于C#调用VC++ DLL,需要在C++中添加对外接口,并使用DllImport在C#中进行调用。详细步骤包括:生成TLB文件、添加System.Runtime.InteropServices命名空间、定义C++的导出函数和C#的DllImport方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

      添加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#就可直接调用了  
                  [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;  
                  }  

    

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值