有谁知道用C#编程控制拨号上网的技术吗?
我想自己编码实现ADSL拨号上网      C# 
 请高手赐教
------解决方案--------------------调用代码: 
 RASDisplay ras = new RASDisplay(); 
     ras.Disconnect();//断线 
 ras.Connect( "adsl ");//拨号,adsl是宽带连接的名称     
 //ADSL自动断拨号类  
 //===================================== 
 using System; 
 using System.Runtime.InteropServices; 
 public struct RASCONN 
 { 
     public int dwSize; 
     public IntPtr hrasconn; 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst=257)] 
     public string szEntryName; 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst=17)] 
     public string szDeviceType; 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst=129)] 
     public string szDeviceName; 
 }   
 [StructLayout(LayoutKind.Sequential,CharSet=CharSet.Auto)] 
 public struct RasStats 
 { 
     public int dwSize; 
     public int dwBytesXmited; 
     public int dwBytesRcved; 
     public int dwFramesXmited; 
     public int dwFramesRcved; 
     public int dwCrcErr; 
     public int dwTimeoutErr; 
     public int dwAlignmentErr; 
     public int dwHardwareOverrunErr; 
     public int dwFramingErr; 
     public int dwBufferOverrunErr; 
     public int dwCompressionRatioIn; 
     public int dwCompressionRatioOut; 
     public int dwBps; 
     public int dwConnectionDuration; 
 }   
 [StructLayout(LayoutKind.Sequential,CharSet=CharSet.Auto)] 
 public struct RasEntryName  
 {  
     public int dwSize;  
     //[MarshalAs(UnmanagedType.ByValTStr,SizeConst=(int)RasFieldSizeConstants.RAS_MaxEntryName + 1)] 
     public string szEntryName;  
     //#if WINVER5 
     //  public int dwFlags; 
     //  [MarshalAs(UnmanagedType.ByValTStr,SizeConst=260+1)] 
     //  public string szPhonebookPath; 
     //#endif 
 } 
 public class RAS   
 {         
     [DllImport( "Rasapi32.dll ", EntryPoint= "RasEnumConnectionsA ", 
          SetLastError=true)]   
     internal static extern int RasEnumConnections 
         ( 
         ref RASCONN lprasconn, // buffer to receive connections data 
         ref int lpcb, // size in bytes of buffer 
         ref int lpcConnections // number of connections written to buffer 
         );     
     [DllImport( "rasapi32.dll ",CharSet=CharSet.Auto)] 
     internal static extern uint RasGetConnectionStatistics( 
         IntPtr hRasConn,       // handle to the connection 
         [In,Out]RasStats lpStatistics  // buffer to receive statistics 
         ); 
     [DllImport( "rasapi32.dll ",CharSet=CharSet.Auto)] 
     public extern static uint RasHangUp( 
         IntPtr hrasconn  // handle to the RAS connection to hang up 
         );   
     [DllImport( "rasapi32.dll ",CharSet=CharSet.Auto)] 
     public extern static uint RasEnumEntries ( 
         string reserved,              // reserved, must be NULL 
         string lpszPhonebook,         // pointer to full path and 
         //  file name of phone-book file 
         [In,Out]RasEntryName[] lprasentryname, // buffer to receive 
         //  phone-book entries 
         ref int lpcb,                  // size in bytes of buffer 
         out int lpcEntries             // number of entries written 
         //  to buffer 
         );   
     [DllImport( "wininet.dll ",CharSet=CharSet.Auto)] 
     public extern static int InternetDial( 
         IntPtr hwnd, 
         [In]string lpszConnectoid,  
         uint dwFlags, 
         ref int lpdwConnection, 
         uint dwReserved 
         );   
     public RAS() 
     {