引自:http://www.80diy.com/home/20050202/14/3770800.html

C#完全可以调用C++的DLL的  
  DllImport   属性用于指定包含外部方法的实现的   dll   位置。  
   
  namespace   System.Runtime.InteropServices  
  {  
        [AttributeUsage(AttributeTargets.Method)]  
        public   class   DllImportAttribute:   System.Attribute  
        {  
              public   DllImportAttribute(string   dllName)   {...}  
              public   CallingConvention   CallingConvention;  
              public   CharSet   CharSet;  
              public   string   EntryPoint;  
              public   bool   ExactSpelling;  
              public   bool   PreserveSig;  
              public   bool   SetLastError;  
              public   string   Value   {   get   {...}   }  
        }  
  }  
  准确地说,DllImport   属性具有下列行为:    
   
  它只能放置在方法声明上。    
  它具有单个定位参数:指定包含被导入方法的   dll   名称的   dllName   参数。    
  它具有五个命名参数:    
  CallingConvention   参数指示入口点的调用约定。如果未指定   CallingConvention,则使用默认值   CallingConvention.Winapi。    
  CharSet   参数指示用在入口点中的字符集。如果未指定   CharSet,则使用默认值   CharSet.Auto。    
  EntryPoint   参数给出   dll   中入口点的名称。如果未指定   EntryPoint,则使用方法本身的名称。    
  ExactSpelling   参数指示   EntryPoint   是否必须与指示的入口点的拼写完全匹配。如果未指定   ExactSpelling,则使用默认值   false。    
  PreserveSig   参数指示方法的签名应当被保留还是被转换。当签名被转换时,它被转换为一个具有   HRESULT   返回值和该返回值的一个名为   retval   的附加输出参数的签名。如果未指定   PreserveSig,则使用默认值   true。    
  SetLastError   参数指示方法是否保留   Win32“上一错误”。如果未指定   SetLastError,则使用默认值   false。    
  它是一次性属性类。    
   
  这是个例子!  
  //   Void.cs  
   
  using   System;  
  using   System.Text;  
  using   System.Runtime.InteropServices;  
   
  public   class   LibWrap  
  {  
  public   enum   DataType    
  {  
  DT_I2   =   1,  
  DT_I4,  
  DT_R4,  
  DT_R8,  
  DT_STR  
  }  
   
  //   void   SetData(DataType   typ,   void*   object)  
  //   using   AsAny   when   void*   is   expected  
   
  [   DllImport(   "..\\LIB\\PinvokeLib.dll"   )]  
  public   static   extern   void   SetData(   DataType   t,    
  [   MarshalAs(   UnmanagedType.AsAny   )]   Object   o   );  
   
  //   using   overloading   when   void*   is   expected  
   
  [   DllImport(   "..\\LIB\\PinvokeLib.dll",   EntryPoint="SetData"   )]  
  public   static   extern   void   SetData2(   DataType   t,   ref   double   i   );  
   
  [   DllImport(   "..\\LIB\\PinvokeLib.dll",   EntryPoint="SetData"   )]  
  public   static   extern   void   SetData2(   DataType   t,   String   s   );  
   
  }  
   
  public   class   App  
  {  
  public   static   void   Main()  
  {  
  Console.WriteLine(   "Calling   SetData   using   AsAny...   \n"   );  
   
  LibWrap.SetData(   LibWrap.DataType.DT_I2,   (short)12   );  
  LibWrap.SetData(   LibWrap.DataType.DT_I4,   (long)12   );  
  LibWrap.SetData(   LibWrap.DataType.DT_R4,   (float)12   );  
  LibWrap.SetData(   LibWrap.DataType.DT_R8,   (double)12   );  
  LibWrap.SetData(   LibWrap.DataType.DT_STR,   "abcd"   );  
   
  Console.WriteLine(   "\nCalling   SetData   using   overloading...   \n"   );  
   
  double   d   =   12;  
  LibWrap.SetData2(   LibWrap.DataType.DT_R8,   ref   d   );  
  LibWrap.SetData2(   LibWrap.DataType.DT_STR,   "abcd"   );  
  }  
  }  
Posted on 2007-03-03 11:19  曹岳  阅读(762)  评论(0编辑  收藏  举报