Content Preview: rss
428 days ago
最近研究了一下Linq 做了一个通用业务层 本人把数据访问层去掉了 首先因为我的目标是快速开发 不考虑性能和功能性 另外Linq在我眼中就是数据访问层 --在业务层写直接Linq已经足够简单单清晰 先看一下怎么使用 实现三层结构,只需要两步,只需写一行代码 1。用CodeSmith,或SqlMetal,或VS O/R Designer根据数据结构生成实体类 生成内容例如: [Table(Name = "ApplicationForm")] public partial class ApplicationForm { [Column(Name = "Id", IsPrimaryKey = true, IsDbGenerated = true)] public int Id { get; set; } [Column(Name = "Name")] public string Name { get; set; } } 2。业务层继承我的Service<>泛型类 形如: public class ApplicationFormService : Service<ApplicationForm> { } 就这么简单 Service<>的子类将提供了常用的CRUD,Count,Exist操作 并支持较复杂的强类型的查询条件 功能举例 1。查询 (强类型的查询条件) //按ID返回单个对象 ApplicationForm list6 = ApplicationFormService.FindById(10); //返回单个对象。强类型的查询条件 ApplicationForm list5 = ApplicationFormService.Find(p => p.IsInMarket == true && p.Course == 0); //返回多个对象,单个条件 List<ApplicationForm> list1 = ...
532 days ago
上周花了40多RMB买的,还是打76折的,原价58 刚时还挺舍不得,没买过页价比这么高的书 毕竟才300多页,还是正反面页码都算上 实际上正确的算法是340/2=170自然页 合一张纸58/170 = 0.3元 58元买170张纸~ 一张纸就三毛~ 出版社的都穷疯了吧 当本帅没见过纸阿 不过拿到手里觉得实在高兴 因为我好久没买计算机书了 光买王小波看了 还不人性的想买卡尔维诺看 买点专业的东西就有点成就感 特像封建地主大资本家的感觉 再是满书的洋文 咱看的还不痛苦 虽然需要像盲人一像不断的查字典 还是一口气看下去了30多页 虽然我只有在看错字满页的盗版书时才会有这种龟速 O'Reilly的书还就是让人看的舒服 白白的书页就像女人的那个,软软的 从视觉和触觉上都非常的相似 还有就是传统的动物书封面 那几个裸体的企鹅也不知道是小妹妹还是小弟弟~ 它们为什么不觉得脸红阿~ 让我抱着书睡都在梦到企鹅 最后害的我突发神经 放假时去了半天的图书馆 专找O'Reilly的书看 主要是做了一件见不得人的事(此去得真事隐去) 累死本帅了 今天一看Chine-Pub八周年店庆,全场7-75折 我寒~712 days ago
警告:本系列文章为本人原创,只作技术研究之用,您可以引用链接传播,禁止其它的转载方式,禁止用于商业或非法目的, 对于造成的一切后果本人概不负责 首先, 得到当前的指令, 注意处理双字节的情况(以0xFE开始的字节) BYTE b = source[index]; index++; if(IsPrefix(b)) { b = source[index]; index++; current = (opcode)twoByteOpcodes[b]; } else { current = (opcode)oneByteOpcodes[b]; } 直接输出current的Instruction成员就是当前指令的字符串表示 然后, 根据类型, 得到操作数 switch(current.Type()) { case Switch: switchCount = *((DWORD*)&source[index]); index += 4; operand = &source[index]; index += switchCount * sizeof(DWORD); break; case Token: operand = &source[index]; break; case Branch: operand = &source[index]; index += current.OperandSize(); break; case Index: operand = &source[index]; index += current.OperandSize(); break; case Value: operand = &source[index]; ...
712 days ago
警告:本系列文章为本人原创,只作技术研究之用,您可以引用链接传播,禁止其它的转载方式,禁止用于商业或非法目的, 对于造成的一切后果本人概不负责 在方法头之后就是一字节形式存储的IL指令, 详细的IL取值请见: Partition III CIL, 比如有: Opcode Instruction 0x00 nop 0x01 break 0x02 ldarg.0 .... 0x26 pop 0x27 jmp 0x28 call 0x29 calli 0x2A ret 0x2B br.s ... 0xFE 0x00 arglist 0xFE 0x01 ceq 0xFE 0x02 cgt 0xFE 0x03 cgt.un 0xFE 0x04 clt 如果按操作码的大小分类, 指令可以分为两组, 一组的操作码只占一个字节, 一组占两个字节, 并高位字节为0xFE 如果按是否含有操作数(参数), 可以分为无操作数, 和有操作数, 有操作数又可以细分为: 1) 操作数是一个Token, 比如 callvirt 指令 2) 操作数是一个跳转的目标Label, 比如br指令 3) 操作数是一个具体的值, 比如ldc.i4指令 4) 操作数是一个方法形参的索引指, 比如ldarg.s指令 5) 操作数是switch指令 按操作数占用大小又分为: 1) 1个字节, 比如br.s指令 ldc.i4.s指令 2) 2个字节, 比如ldarg指令 3) 4个字节, 比如br指令 ldc.i4指令 4) 8个字节, 比如ldc.i8指令, 程序需要针对不同的操作数类型, 以及大小进行不同的反汇编处理 因为操作数类型, 以及大小是可以确定的, 所以程序中我用一个结构类型保存这些确定的值(先下面的OperandType枚举, 和opcode结构) 然后以指令的字节形式为key保存在Map中 操作码为一个字节的Map m[0x00] = opcode(L"nop"); m[0x01] = ...
715 days ago
警告:本系列文章为本人原创,只作技术研究之用,您可以引用链接传播,禁止其它的转载方式,禁止用于商业或非法目的, 对于造成的一切后果本人概不负责 MethodDef的Rva定义了一个方法的位置, 每个方法体之前都有一个方法头 方法头分为tiny头 和 fat头两种格式, 方法的前两位定义是tiny还是fat头, Partition II Metadata文档描述如下: 25.4.1 Method header type values The two least significant bits of the first byte of the method header indicate what type of header is present. These 2 bits will be one and only one of the following: Value Value Description CorILMethod_TinyFormat 0x2 The method header is tiny (§25.4.2) . CorILMethod_FatFormat 0x3 The method header is fat (§25.4.3). tiny头的格式比较简单, 只有一个字节, 除了最低的0x2外, 其余6位保存IL代码的大小 如果一个方法没有局部变量, 异常处理, 方法小于64字节, 存储栈深度为8时, 那么就使用tiny头 Partition II Metadata文档描述如下: Start Bit Count of Bits Description 0 2 Flags (CorILMethod_TinyFormat shall be set, see §25.4.4) 2 6 Size, in bytes, of the method body immediately following this header. fat头的格式就比较复杂, 大小是12个字节, Partition II ...



