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

      当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);  
   
                  ///  

 
                  ///  
 
                  ///    
                  ///  
                 
                  ///    
                  ///    
                  ///    
                  public   int   SelectDummyRecord(  
                          out   int   lErrorType,  
                          out   int   lErrorCode)  
                  {  
                          int   intRtn;  
   
                          intRtn   =   SelectDummyRecord(  
                                  out   lErrorType,  
                                  out   lErrorCode,  
                                  m_OutGetObj);  
   
                          return   intRtn;  
                  }  

    

你可能感兴趣的:(c#编程相关问题)