- 博客(46)
- 资源 (5)
- 收藏
- 关注
原创 FromHandle与FromChildHandle的区别
我在使用PropertyControl插件的时候,经常遇到一个问题,就是无法用窗口探测器探测到WebBrowser,原因很简单,探测到的句柄本身并不是Control对象,可能是它的一个子控件,而这个控件并没有封装成System.Windows.Forms.Control对象,所以解决办法是:如果FromHandle返回null,则继续枚举其父控件,只到找到为止,本来想自己写的,无意中发现了Fr
2011-06-07 16:21:00
779
原创 Visual Studio调试时,中断在非托管的导出函数
<br />1.项目属性-调试-启用非托管代码调试<br />2.工具-选项-调试-本机,加载DLL导出
2011-04-01 08:02:00
635
原创 引用类型与地址之间的转换
<br />很早之前就在网上找到引用对象转地址的方法,后来自己研究出了地址转引用类型的方法,当时很兴奋,还准备把自己的研究过程写下来。<br /> <br />今天要用下这个功能,居然发现没有任何记录,敢情当初忘了写了?<br /> <br />又费了好半天功能,才把这个功能重写了一次,这次就不写过程了,直接上代码:<br /> <br /> <br /> IntPtr ObjectToAddress(object obj) { GCHandle g
2011-03-31 11:58:00
514
原创 托管函数的挂钩(完美版)
我之前发过一篇叫“托管函数的挂钩”的文章,实现了对MarshalByRefObject继承树下的实例函数的挂钩。最近,在CodeProject上看到一个关于托管函数挂钩的文章,发现作者的方法很好用,但是正好不能用于MarshalByRefObject继承树下的实例函数(作者本人并没有发现这个问题),于是两种方法正好互补你也许要用,我为什么要强调MarshalByRefObject继承树呢?这是因为非常多的类都存在于该类的继承树下,比如很多人习惯把代码写在自己的窗体类中,而Form就在MarshalByRef
2011-03-20 11:52:00
1069
原创 注意了,由于代码优化,可能导致调试时源代码不匹配
最近出现一怪事:调试时断点不匹配,而且找不到标识符例如:void Foo(){int a=SomeMethod();//断点在这一行Console.WriteLine("OK");}我把断点设在第一行,调试时居然自动跑到第二行去了;而且我想在监视窗口中看一下a的值,结果提示我当前上下文不存在名称a类似的问题出现好几次了,我的感觉就是符号文件出问题了,Clean之后问题依旧今天又遇到这个问题了,突然一想,会不会是因为编译成Release的原因呢?(手头这个项目之前已经完成了,最近有点改动,所以没有改成Debu
2010-08-10 16:14:00
968
原创 发送电子邮件
很早之前就用过,不过每次要使用的时候还是要在网上查一下,所以干脆写下来,以备后用。为了方便使用,做了几个重载:public class EMailSender{ public static void SendEMail(string senderAddress, string password, string host, string receiverAddress, string subject, string body, string attachmentFile = null, stri
2010-08-10 15:05:00
676
原创 解决使用用户控件时,由于使用了当前路径导致设计器不能正常工作的问题
当在用户控件中使用当前路径时,如果使用下列方法,可能会导致设计器不能正常工作: Environment.CurrentDirectoryPath.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)Path.GetDirectoryName(Assembly.GetEntryAssembly().Loca
2010-04-02 16:43:00
486
原创 WPF版的WindowFromPoint
在Win32 API中,有一个非常有用的函数,叫做:WindowFromPoint而在WPF中,有一个类型的函数,叫做:HitTest(InputHitTest),但是这个函数探测的太深了,往往会探测到控件的子元素上去于是我写了一个WPF版的WindowFromPoint函数,为了在一个函数里实现全部的功能,使用了Lambda表达式的递归实现(估且叫伪递归吧),所以对很多人来说,可能会显然
2010-03-10 00:27:00
1031
原创 WPF学习心得(3)——触发器
WPF学习心得(3) 触发器 触发器包括以下几种:属性触发器 EventTrigger 和 Storyboard MultiTrigger、DataTrigger 和 MultiDataTrigger 本系统讨论其中的两种:属性触发器和事件触发器,由于属性只能出现在样式中,故本文只讨论事件触发器,属性触发器的内容将在样式一章中涉及。 示例代码如下:
2009-12-17 15:11:00
1332
原创 WPF学习心得(2)——模板
WPF学习心得(2) 模板 首先声明,我这里所说的模板,专指WPF中的控件模板(ControlTemplate),而其它的一些模板,如数据模板(DataTemplate)等不在本文的讨论范畴。 模板适用于这样一种场合:控件在功能上满足程序的要求,但界面上不能(或不方便)满足程序的要求,比如说:我们更改一个控件的外观,都是基于其已有的属性——要更改其背景色,设置Back
2009-12-16 16:36:00
1137
原创 WPF学习心得(1)——资源
WPF学习心得(1) 资源 WPF中的资源一般是指资源字典(DictionaryResource)中的元素,可以把任何对象置于其中以便访问。 要获得一个资源字典,可以新建:ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" x
2009-12-15 15:14:00
1543
1
转载 C#程序集加载方法
原文: http://blog.youkuaiyun.com/podded/archive/2008/10/27/3158687.aspx 要从程序集的元数据中获取程序集的信息,首先需要加载程序集。.Net中加载程序集方法有几种,本人结合自己的实践和认识简单介绍一下。描述不一定很准确,请提出来一起进步。一、隐式加载 没有被显式加载但被引用的程序集,CLR会按照全局程序集缓存(GA
2009-11-27 11:04:00
2519
1
原创 如何用代码打开系统的“运行”对话框
如何用代码打开系统的“运行”对话框这个问题我很早之前就知道了,但今天要用的时候,居然给忘了,查了好半天才搞出来,所以这里有必要记录一下,另外也可以了解一下COM的调用及C#4.0中的Dynamic Lookup。所谓“运行”对话框,就是开始菜单里的那个运行,其快捷键为Windows+R,相信很多人都用过,我这里介绍三种方法来打开“运行”对话框:一、模拟按键由于.NET类库里的Sen
2009-11-10 13:26:00
2322
原创 对象的深层拷贝
遇到这么个问题,没有参考任何资料,自己想了个方法对于自定义的一些简单类型还好,遇到.Net里一些复杂的类就无能为力了,不知道还有什么更好的方法。 class CsToD{ //基本思想是:一个对象所占据的内存空间,取决于它的实例字段(包括继承树上的私有实例字段) public T DeepCloneObject(T obj) where T : class {
2009-07-29 14:15:00
1087
原创 如何获得一个对象的引用的类型
很早就有一个疑问:class Father{}class Son:Father{}Father obj=new Son();如何写一个方法,得到obj的引用的类型为Father,而其本身的类型为Son呢? 以前只知道调用obj.GetType()就得到了其自身的类型Son,但是一直不知道怎么得到其引用的类型,这两天不经意间研究出来了一个方法: vo
2009-07-26 11:28:00
530
原创 对象的深拷贝
今天遇到一个问题,如何深层拷贝一个对象? 想了一个方法,前提是所有相关类型都必须具有公共、无参、实例构造函数。 public object DeepCloneObject(object obj) { object newObj = Activator.CreateInstance(obj.GetType()); foreach
2009-07-24 17:19:00
384
原创 正则小技巧
前两天在优快云看到这样一个问题:给定一段文字的编码序列,如604F20007D59(你 好),如何得到其对应的文字有人给出了如下正则解决方案: string input = "4F600020597D"; string patern = "(? string output = Regex.Unescape(Regex.R
2009-07-21 09:10:00
358
原创 拆分字符串的几个技巧
1、 如何获得一个已知的字符串数组?例如你可能会这样做:String[]strs={“one”,”two”,”three”,”four”};这样显得有点复杂,更为简单的方法是:String[]strs=”one two three four”.Split();2、 如何获得一个已知的字符数组?跟上面类似,应该这样:Char[]cs=”abcde”.ToCharArr
2009-06-29 09:09:00
584
原创 托管函数的挂钩
很早以前就想研究一下托管函数的挂钩,但是一直没有成功。前段时间又尝试了一次,竟然成功了,这让我十分的困惑——因为我几乎没有对代码做任何改变! 这次实验距离以前已经有很长时间了,我实在想不出有什么不同之处,唯一的区别就是以前用的是控制台程序,这次是WinForm程序,但我想不可能是这个原因吧?不过我还是尝试了一下,未曾料到竟真是如此! 我当然不会相信这样的灵异事件! 于是我想
2009-06-28 21:33:00
719
原创 C#深入剖析(2)——析构函数
第二篇 析构函数 析构函数在C#中已经很少使用了,以至于很多人已经把它淡忘了,虽然用处不大,研究一下也无妨。 一. 析构函数的特征: 析构函数只能存在于类中,而不能存在于结构中;析构函数不能有任何修饰符,包括访问控制修饰符,静态修饰符,抽象修饰符,虚拟修饰符等都不能有;析构函数没有参数,这就意味着不能有任何重载。 二. 析构函数的调用时机: 析构函数会在对象被垃圾收集器回收时调用,但垃圾收集
2009-06-16 23:00:00
755
原创 C#深入剖析(1)——事件
准备写一个系列文章,深入探讨C#及.Net中的某些特性。 第一篇 事件 事件相信每个人都不陌生,随便一个WinForm程序,就会使用大量的事件,比如: C# code <!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/
2009-06-15 22:35:00
701
3
原创 本地缓冲区溢出
今天看了下缓冲区溢出,总算是了解了个大概,并且尝试了本地的缓冲区溢出,代码如下:#includechar strShellcode[] ="/x41/x41/x41/x41""/x41/x41/x41/x41""/x22/x33/x44/x55""/x12/x45/xfa/x7f"//以下是shellcode 开dos窗口"/x55/x8B/xEC/x33/xC0/
2009-06-14 22:04:00
504
1
原创 继续多线程、异步的研究
今天继续研究了下多线程、异步,并对昨天的代码进行了多次修改,已在上篇文章中更新了。 通过对于实现异步的多种方式,发现还是直接开线程最快,另外.Net提供了一些便利的方法,比如线程池、异步委托,不过效率都较之直接开线程慢,我估计异步委托就是用线程池来做的,因为两者效率差不多。另外还有许多类提供了Begin.. End..之类的方法来实现异步调用,很奇怪的事,居然IAsyncResult接
2009-06-13 22:13:00
315
原创 多线程端口扫描
今天在论坛发了一个帖子:【200分】多线程问题最后我把代码封装了一下: public class PortScan{ public static void ScanOpenedPorts(int count, string host, int start, int end, Action portReady, Action completed) {
2009-06-12 22:34:00
463
原创 溢出
这两天终于溢出成功了!昨天我尝试入侵我所在IP段的机器,居然正好是我们班的,这个世界真是太小了,呵呵。不过今天在网吧就没那么幸运了,服务没开,又是强制来宾,我也是无能为力啊。
2009-06-11 21:03:00
450
转载 由struct的静态构造函数说起
转自路西菲尔的文章,原文在这里 最近才知道struct和class的静态构造函数的触发规则是不同的,不像class在第一次使用类的时候触发静态构造函数。如果只访问struct实例的字段是不会触发静态构造函数调用的。通过测试发现当访问静态字段,struct本身的函数(静态和实例)和带参数的构造函数就会引起静态构造函数的执行。而调用默认构造和未覆写的基类虚函数是不会的。为什么呢? 让我们
2009-06-09 21:40:00
409
原创 用正则表达式更新源字符串
问题源于这个帖子:http://topic.youkuaiyun.com/u/20090608/11/6118ebe2-5ed5-4305-9947-d9573a26e764.html?seed=1379233329 我把这个问题转换成了7,9楼所述,最后我的实现方法是: class CsToD { private string[] groups;
2009-06-08 22:04:00
259
转载 类和结构的区别
来源于 C#编程语言详解(第2版) 11.3 类和结构的区别结构在以下几个重要方面与类不同:— 结构是值类型(参见11.3.1小节)。— 所有结构类型都隐式地继承自类System.ValueType(参见11.3.2小节)。— 对结构类型的变量进行赋值,将创建所赋的值的一个“副本”(参见11.3.3小节)。— 结构的默认值的生成方式为:将所有值类型的域设置为它
2009-06-07 22:24:00
566
原创 自定义超时
这是一个很有意思的话题:很多时候,一个操作如果成功的话,很快就会得到响应,反正,只有当长时间没有响应,我们才能确定该操作失败。例如Ping一个主机,如果主机可以连接的话,马上就有反应;反之,如果对于Ping命令,主机长时间不响应,我们才能认定主机无法连通。所以这里有个TimeOut的问题。问题是,很多操作并不提供一个设置超时的方法,例如通过Dns.GetHostByAddress解析主
2009-06-06 22:12:00
411
原创 托管注入深入研究 (《黑客防线》2008.12)
这是我发表在《黑客防线》2008年12期上的一篇文章,这里是网络上的首发。 附件是我写的一个工具“超级间谍(SuperSpy)”,主要包括一个窗口探测功能,甚至能够探测到VC自带的SPY++所不能探测到的窗口;当然,还包括这里提到的“托管注入”功能。 程序需运行在.Net2.0以上,如果需要使用注入功能,则需要.Net3.5以上。 超级间谍下载地址: http://download.csdn.ne
2009-06-05 22:12:00
1234
4
转载 第四章 关键字和操作符
-4- 关键字和操作符 位于return语句之后的代码是不会被执行的。在下面给出的第1个程序中,你将发现在C#中有一个WriteLine函数调用,但是在我们的IL代码中却看不到。这是因为编译器意识到任何return之后的语句都不会被执行,从而,也就不用将其转换到IL中了。a.csclass zzz{public static void Main(){retu
2009-06-03 20:38:00
546
原创 Parse方法解析字符串
今天才注意到Parse方法解析字符串时可以通过NumberStyles枚举和IFormatProvider接口分析字符串的格式。
2009-06-02 21:43:00
597
转载 第三章 选择和循环
-3- 在IL中,标号(label)是一个末尾带有冒号(即:)的名称。它使我们能够从代码的一部分无条件地跳转到另一部分。我们经常在由反编译器生成的IL代码中看到这个标号。例如:IL_0000: ldstr "hi"IL_0005: call void [mscorlib]System.Console::WriteLine(class System.String
2009-06-01 15:28:00
412
转载 第二章 IL基础
如果你真的想要理解C#代码,那么最好的方法就是通过理解由C#编译器生成的代码。本章和下面两章将关注于此,请相信我们。 因此,我们将用一个小的C#程序揭露并解释有编译器生成的IL代码。通过这样做,我们就可以“一箭双雕”了:首先,我们将能够揭开IL的神秘,其次我们将更直观地理解C#编程语言。 我们将首先向你展示一个.cs文件,并随后由C#编译器用IL编写一个程序
2009-05-31 07:16:00
697
1
转载 第一章 IL入门
转自包建强的翻译文章,原文在这里,后续文章不再说明。-1- 我们用C#、VB.NET语言编写的代码最终都会被编译成程序集或IL。因此用VB.NET编写的代码可以在C#中修改,随后在COBOL中使用。因此,理解IL是非常有必要的。 一旦熟悉了IL,理解.NET技术就不会有障碍了,因为所有的.NET语言都会编译为IL。IL是一门中性语言。IL是先发明的,随后才有了C
2009-05-29 18:12:00
1011
转载 一段很优雅的Linq代码
来自MSDNusing System;using System.IO;using System.Linq;class Program{ static void Main(string[] args) { try { var files = from file in Directory.EnumerateFiles(@"c:/
2009-05-28 06:47:00
402
原创 在VB.NET中使用转义字符
VB.NET 里面不太好表达转义字符,通常的方法是用字符串连接的方法比如要表达一个跟C#中"I/r/nlove/r/nyou"相同的字符串,需要这样写:"I" + vbCrLf + "love" + Chr(10) + Chr(13) + "you"实在是太麻烦了。其实有简单的方法,如下:Regex.Unescape("I/r/nlove/r/nyou")其中Regex位于
2009-05-27 20:37:00
1215
原创 结构内存布局
本来打算写一篇文章,详细地讨论一下结构的内存布局,但是想了下,跟路西菲尔的这篇文章也差不多,所以这里只做一下补充:一、对齐长度如果没有显式的指定对齐长度,将以结构中占用空间最大的成员的长度作为对齐长度;如果要显式指定对齐长度,需设置StructLayoutAttribute.Pack,如: [StructLayout(LayoutKind.Sequential,Pack=4)]
2009-05-26 20:14:00
480
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人