Oct 1

C#搜索LDAP记录 不指定

kcao , 14:39 , 技术 , 评论(0) , 引用(0) , 阅读(2241) , Via 本站原创

以下代码可以把LDAP上指定ALIAS的人的所有信息查出来

C# Code Copy Code To Clipboard
  1. public void test(string username,string password)   
  2. {   
  3.     DirectoryEntry root = new DirectoryEntry("LDAP://ldap.slb.com/o=slb,c=an");   
  4.     root.AuthenticationType = AuthenticationTypes.SecureSocketsLayer;   
  5.   
  6.     DirectorySearcher searcher = new DirectorySearcher(root);   
  7.     searcher.Filter = "(alias=" + Environment.UserName + ")";   
  8.     SearchResultCollection results=searcher.FindAll();   
  9.     SearchResult result=searcher.FindOne();   
  10.                    
  11.     PropertyCollection p = result.GetDirectoryEntry().Properties;   
  12.   
  13.     foreach (PropertyValueCollection i in p)   
  14.     {   
  15.         string v="";   
  16.         if (i.Count > 1)   
  17.         {   
  18.             foreach (string ii in i)   
  19.             {   
  20.                 v += ii + "\n";   
  21.             }   
  22.         }   
  23.         else  
  24.         {   
  25.             v = i.Value.ToString(); ;   
  26.         }   
  27.         MessageBox.Show(i.PropertyName + ": " + v);   
  28.     }  
Tags: , , ,
Sep 17

C#开发LDAP认证 不指定

kcao , 14:33 , 技术 , 评论(0) , 引用(0) , 阅读(2979) , Via 本站原创

开始时写的:

C# Code Copy Code To Clipboard
  1. DirectoryEntry root = new DirectoryEntry("ldap://ldap.slb.com:389",username,password);
  2. root.AuthenticationType = AuthenticationTypes.None;
  3. DirectorySearcher searcher = new DirectorySearcher(root);
  4. SearchResultCollection results=searcher.FindAll();

结果总是在FindAll()的地方出错,报告"Unknown Error 0x80005000",后来发现,协议的ldap一定要改成大写才行:

C# Code Copy Code To Clipboard
  1. DirectoryEntry root = new DirectoryEntry("LDAP://ldap.slb.com:389",username,password);
  2. root.AuthenticationType = AuthenticationTypes.None;
  3. DirectorySearcher searcher = new DirectorySearcher(root);
  4. SearchResultCollection results=searcher.FindAll();

这样写就对了,呵呵

Tags: ,
Jan 25

PRO文件大多比较臃肿,想找一个能快速读取大容量文本文件的方法,在网上找到了如下的代码,但是实际运行下来的结果并不比filestream有什么优势,因此就把这段代码帖在这里,以作参考用.

用于试验的PRO文件为1.9M左右,73917行,用以下方法和filestream读取全部并AppendText到文本框中,大约都是7秒钟.但是这种方法就烦杂了很多.

HiddenC# Code Copy Code To Clipboard
  1. public const uint CREATE_NEW = 1;
  2. public const uint CREATE_ALWAYS = 2;
  3. public const uint OPEN_EXISTING = 3;
  4. public const uint FILE_BEGIN = 0;
  5. public const uint FILE_CURRENT = 1;
  6. public const uint FILE_END = 2;
  7. public const int GENERIC_READ = -2147483648; //0x80000000
  8. public const int GENERIC_WRITE = 0x40000000;
  9. public const int GENERIC_EXECUTE = 0x20000000;
  10. public const int GENERIC_ALL = 0x10000000;
  11. public const int FILE_ATTRIBUTE_NORMAL = 0x80;
  12. public const int FILE_FLAG_SEQUENTIAL_SCAN = 0x8000000;
  13. public const int INVALID_HANDLE_VALUE = -1;
  14.  
  15. public const int PAGE_NOACCESS = 1;
  16. public const int PAGE_READONLY = 2;
  17. public const int PAGE_READWRITE = 4;
  18.  
  19. public const int FILE_MAP_COPY = 1;
  20. public const int FILE_MAP_WRITE = 2;
  21. public const int FILE_MAP_READ = 4;
  22.  
  23.  
  24. [DllImport("kernel32.dll")]
  25. public static extern IntPtr CreateFileMapping(IntPtr hFile,
  26. IntPtr lpFileMappingAttributes, uint flProtect,
  27. uint dwMaximumSizeHigh,
  28. uint dwMaximumSizeLow, string lpName);
  29.  
  30. [DllImport("kernel32.dll")]
  31. public static extern IntPtr MapViewOfFile(IntPtr hFileMappingObject, uint
  32. dwDesiredAccess, uint dwFileOffsetHigh, uint dwFileOffsetLow,
  33. IntPtr dwNumberOfBytesToMap);
  34.  
  35. [DllImport("kernel32.dll")]
  36. public static extern bool UnmapViewOfFile(IntPtr lpBaseAddress);
  37.  
  38. [DllImport("kernel32.dll")]
  39. public static extern bool CloseHandle(IntPtr hObject);
  40.  
  41. [DllImport("kernel32.dll")]
  42. public static extern IntPtr CreateFile(string lpFileName,
  43. int dwDesiredAccess, FileShare dwShareMode, IntPtr securityAttrs,
  44. FileMode dwCreationDisposition, int dwFlagsAndAttributes, IntPtr hTemplateFile);
  45.  
  46. [DllImport("kernel32.dll")]
  47. public static extern uint GetFileSize(IntPtr hFile, IntPtr lpFileSizeHigh);
  48.  
  49. public string returnback(string path)
  50. {
  51. string str = "";
  52. /*IntPtr vFileHandle = CreateFile(path,
  53. GENERIC_READ | GENERIC_WRITE, FileShare.Read | FileShare.Write,
  54. IntPtr.Zero, FileMode.Open,
  55. FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, IntPtr.Zero);*/
  56. IntPtr vFileHandle = CreateFile(path,
  57. GENERIC_READ, FileShare.Read,IntPtr.Zero,
  58. FileMode.Open,
  59. FILE_ATTRIBUTE_NORMAL,IntPtr.Zero);
  60.  
  61.  
  62. if (INVALID_HANDLE_VALUE != (int)vFileHandle)
  63. {
  64. IntPtr vMappingHandle = CreateFileMapping(
  65. vFileHandle, IntPtr.Zero, PAGE_READONLY, 0, 0, "");
  66. if (vMappingHandle != IntPtr.Zero)
  67. {
  68. IntPtr vHead = MapViewOfFile(vMappingHandle,
  69. FILE_MAP_READ, 0, 0, IntPtr.Zero);
  70. if (vHead != IntPtr.Zero)
  71. {
  72. uint vSize = GetFileSize(vFileHandle, IntPtr.Zero);
  73. byte[] temp = new byte[vSize];
  74. for (int i = 0; i < vSize; i++)
  75. {
  76. byte vTemp = Marshal.ReadByte((IntPtr)((int)vHead + i));
  77. temp[i] = vTemp;
  78. }
  79. ASCIIEncoding encoding = new ASCIIEncoding();
  80. str = encoding.GetString(temp).Replace("rn", "rn");
  81. UnmapViewOfFile(vHead);
  82. }
  83. CloseHandle(vMappingHandle);
  84. CloseHandle(vHead);
  85. }
  86. CloseHandle(vFileHandle);
  87.  
  88. }
  89. return str;
  90. }

 

 

以下是第二种方法的代码:

C# Code Copy Code To Clipboard
  1. private string ReadSource(string filename)
  2. {
  3. if (!File.Exists(filename)) return filename + " is invalid.";
  4.  
  5. FileStream fs = new FileStream(@filename, FileMode.Open, FileAccess.Read, FileShare.Read);
  6. byte[] bt = new byte[fs.Length];
  7. int i = 1;
  8.  
  9. i = fs.Read(bt, 0, bt.Length);
  10. string str = System.Text.Encoding.ASCII.GetString(bt);
  11.  
  12. return str;

 

Tags: ,
Jan 14

用Thread.Join 方法

阻塞调用线程,直到某个线程终止时为止。

 

HiddenC# Code Copy Code To Clipboard
  1. using System;
  2. using System.Threading;
  3.  
  4. class Test
  5. {
  6. static TimeSpan waitTime = new TimeSpan(0, 0, 1);
  7.  
  8. public static void Main()
  9. {
  10. Thread newThread =
  11. new Thread(new ThreadStart(Work));
  12. newThread.Start();
  13.  
  14. if(newThread.Join(waitTime + waitTime))
  15. {
  16. Console.WriteLine("New thread terminated.");
  17. }
  18. else
  19. {
  20. Console.WriteLine("Join timed out.");
  21. }
  22. }
  23.  
  24. static void Work()
  25. {
  26. Thread.Sleep(waitTime);
  27. }
  28. }

 

Tags: ,
Jan 6

在基于Windows平台的程序设计中,事件(event)是一个很重要的概念。因为在几乎所有的Windows应用程序中,都会涉及大量的异步调用,比如响应点击按钮、处理Windows系统消息等,这些异步调用都需要通过事件的方式来完成。即使在下一代开发平台——.NET中也不例外。

那么什么是事件呢?所谓事件,就是由某个对象发出的消息,这个消息标志着某个特定的行为发生了,或者某个特定的条件成立了。比如用户点击了鼠标、socket上有数据到达等。那个触发(raise)事件的对象称为事件的发送者(event sender),捕获并响应事件的对象称为事件的接收者(event receiver)。

在这里,我们将要讨论的是,在.NET的主流开发语言C#中如何使用自定义的事件来实现我们自己的异步调用。

在C#中,事件的实现依赖于delegate,因此我们有必要先了解一下delegate的概念。

C# Delegate

delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。与其它的类不同,delegate类能够拥有一个签名(signature),并且它只能持有与它的签名相匹配的方法的引用。它所实现的功能与C/C++中的函数指针十分相似。它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m。但与函数指针相比,delegate有许多函数指针不具备的优点。首先,函数指针只能指向静态函数,而delegate既可以引用静态函数,又可以引用非静态成员函数。在引用非静态成员函数时,delegate不但保存了对此函数入口指针的引用,而且还保存了调用此函数的类实例的引用。其次,与函数指针相比,delegate是面向对象、类型安全、可靠的受控(managed)对象。也就是说,runtime能够保证delegate指向一个有效的方法,你无须担心delegate会指向无效地址或者越界地址。

实现一个C# delegate是很简单的,通过以下3个步骤即可实现一个delegate:

1. 声明一个delegate对象,它应当与你想要传递的方法具有相同的参数和返回值类型。

2. 创建delegate对象,并将你想要传递的函数作为参数传入。

3. 在要实现异步调用的地方,通过上一步创建的对象来调用方法。

下面是一个简单的例子:

  1. using System;  
  2. public class MyDelegateTest  
  3. {  
  4. // 步骤1,声明delegate对象  
  5. public delegate void MyDelegate(string name);  
  6. // 这是我们欲传递的方法,它与MyDelegate具有相同的参数和返回值类型  
  7. public static void MyDelegateFunc(string name)  
  8. {  
  9. Console.WriteLine("Hello, {0}", name);  
  10. }  
  11.  
  12. public static void Main()  
  13. {  
  14. // 步骤2,创建delegate对象  
  15. MyDelegate md = new MyDelegate(MyDelegateTest.MyDelegateFunc);  
  16. // 步骤3,调用delegate  
  17. md("sam1111");  
  18. }  

输出结果是:Hello, sam1111

了解了delegate,下面我们来看看,在C#中对event是如何处理的。

C# event

C#中的事件处理实际上是一种具有特殊签名的delegate,象下面这个样子:

public delegate void MyEventHandler(object sender, MyEventArgs e);

其中的两个参数,sender代表事件发送者,e是事件参数类。MyEventArgs类用来包含与事件相关的数据,所有的事件参数类都必须从System.EventArgs类派生。当然,如果你的事件不含参数,那么可以直接用System.EventArgs类作为参数。

就是这么简单,结合delegate的实现,我们可以将自定义事件的实现归结为以下几步:

1. 定义delegate对象类型,它有两个参数,第一个参数是事件发送者对象,第二个参数是事件参数类对象。

2. 定义事件参数类,此类应当从System.EventArgs类派生。如果事件不带参数,这一步可以省略。

3. 定义事件处理方法,它应当与delegate对象具有相同的参数和返回值类型。

4. 用C# event关键字定义事件对象,它同时也是一个delegate对象。

5. 用+=操作符添加事件到事件队列中(-=操作符能够将事件从队列中删除)。

6. 在需要触发事件的地方用调用delegate的方式写事件触发方法。一般来说,此方法应为protected访问限制,既不能以public方式调用,但可以被子类继承。名字是OnEventName。

7. 在适当的地方调用事件触发方法触发事件。

下面是一个简单的例子:

 

  1. using System;  
  2. public class EventTest  
  3. {  
  4. // 步骤1,定义delegate对象  
  5. public delegate void MyEventHandler(object sender, System.EventArgs e);  
  6. // 步骤2省略  
  7. public class MyEventCls  
  8. {  
  9. // 步骤3,定义事件处理方法,它与delegate对象具有相同的参数和返回值类型  
  10. public void MyEventFunc(object sender, System.EventArgs e)  
  11. {  
  12. Console.WriteLine("My event is ok!");  
  13. }  
  14. }  
  15. // 步骤4,用event关键字定义事件对象  
  16. private event MyEventHandler myevent;  
  17. private MyEventCls myecls;  
  18. public EventTest()  
  19. {  
  20. myecls = new MyEventCls();  
  21. // 步骤5,用+=操作符将事件添加到队列中  
  22. this.myevent += new MyEventHandler(myecls.MyEventFunc);  
  23. }  
  24. // 步骤6,以调用delegate的方式写事件触发函数  
  25. protected void OnMyEvent(System.EventArgs e)  
  26. {  
  27. if(myevent != null)  
  28. myevent(this, e);  
  29. }  
  30.  
  31. public void RaiseEvent()  
  32. {  
  33. EventArgs e = new EventArgs();  
  34. // 步骤7,触发事件  
  35. OnMyEvent(e);  
  36. }  
  37.  
  38. public static void Main()  
  39. {  
  40. EventTest et = new EventTest();  
  41. Console.Write("Please input a:");  
  42. string s = Console.ReadLine();  
  43. if(s == "a")  
  44. {  
  45. et.RaiseEvent();  
  46. }  
  47. else 
  48. {  
  49. Console.WriteLine("Error");  
  50. }  
  51. }  

输出结果如下,黑体为用户的输入:

Please input ‘a’: a

My event is ok!

小结

通过上面的讨论,我们大体上明白了C# delegate和C# event的概念,以及如何在C#中使用它们。我个人认为,delegate在C#中是一个相当重要的概念,合理运用的话,可以使一些相当复杂的问题变得很简单。有时我甚至觉得,delegate甚至能够有指针的效果,除了不能直接访问物理地址。而且事件也是完全基于delegate来实现的。由于能力有限,本文只是对delegate和event的应用作了一个浅显的讨论,并不深入,我希望本文能够起到抛砖引玉的作用。真正想要对这两个概念有更深入的了解的话,还是推荐大家看MSDN。

Tags: , ,
分页: 4/6 第一页 上页 1 2 3 4 5 6 下页 最后页 [ 显示模式: 摘要 | 列表 ]