基于.NET平台常用的框架整理【转】

本文转自: https://www.cnblogs.com/hgmyz/p/5313983.html

分布式缓存框架:

Microsoft Velocity:微软自家分布式缓存服务框架。

Memcahed:一套分布式的高速缓存系统,目前被许多网站使用以提升网站的访问速度。

Redis:是一个高性能的KV数据库。 它的出现很大程度补偿了Memcached在某些方面的不足。

EnyimMemcached:访问Memcached最优秀的.NET客户端,集成不错的分布式均衡算法。

开源的.NET系统推荐:

OXITE:微软ASP.NET MVC案例演示框架。

PetShop:微软ASP.NET宠物商店。

Orchard:国外一个MVC开源的博客系统。

SSCLI:微软在NET Framework 2.0时代的开源代码。

DasBlog:国外一个基于ASP.NET的博客系统。

BlogEngine.NET:国外一款免费开源的博客系统。

Dotnetnuke.NET:一套非常优秀的基于ASP.NET的开源门户网站程序。

Discuz.NET:国内开源的论坛社区系统。

nopCommerce和Aspxcommerce:国外一套高质量的开源B2C网站系统。

JumboTCMS和DTCMS:国内两款开源的网站管理系统:

日志记录异常处理:

Log4Net.dll:轻量级的免费开源.NET日志记录框架。

Enterprise Library Log Application Black:微软企业库日志记录。

Elmah:实现最流行的ASP.NET应用异常日志记录框架。

NLog:是一个简单灵活的日志记录类库,性能比Log4Net高,使用和维护难度低。

关于NoSQL数据库:

Mongodb:分布式文件存储数据库。

Membase:家族的一个新的重量级的成员。

自动任务调度框架

Quartz.NET:开源的作业调度和自动任务框架。

Topshelf:另一种创建Windows服务的开源框架

依赖注入IOC容器框架:

Unity:微软patterns&practicest团队开发的IOC依赖注入框架,支持AOP横切关注点。

MEF(Managed Extensibility Framework):是一个用来扩展.NET应用程序的框架,可开发插件系统。

Spring.NET:依赖注入、面向方面编程(AOP)、数据访问抽象,、以及ASP.NET集成。

Autofac:最流行的依赖注入和IOC框架,轻量且高性能,对项目代码几乎无任何侵入性。

PostSharp:实现静态AOP横切关注点,使用简单,功能强大,对目标拦截的方法无需任何改动。

Ninject:基于.NET轻量级开源的依赖注入IOC框架

常用的几个ORM框架:

EF(ADO.NET Entity Framework):微软基于ADO.NET开发的ORM框架。

Nhibernate:面向.NET环境的轻量级的ORM框架。

SqlMapper.cs:用于小项目的通用的C#数据库访问类。

AutoMapper:流行的对象映射框架,可减少大量硬编码,很小巧灵活,性能表现也可接受。

SubSonic:优秀的开源的ORM映射框架,同时提供符合自身需要的代码生成器。

FluentData:开源的基于Fluent API的链式查询ORM轻量级框架。

Dapper:轻量级高性能基于EMIT生成的ORM框架。

EmitMapper:性能较高的ORM框架,运行时通过EMIT动态生成IL代码,并非采用反射机制。

格式和数据类型转换

Newtonsoft.Json:目前.NET开发中最流行的JSON序列化库,为新版的WebApi库提供基础。

System.JSON.dll:微软自己开发的JSON序列化组件(需要单独下载)

DataContractJsonSerializer 和 DataContractXmlSerializer:微软在WCF中使用的序列化器。

JavaScriptSerializer:微软默认针对WEB开发者提供的JSON格式化器。

iTextSharp、PDFsharp 和 PDF.NET:通过.NET处理和生成PDF文档的组件。

SharpZipLib.dll:免费开源的ZIP和GZIP文件解压缩组件。

Math.NET:强大的数学运算、微积分、解方程和科学运算。

DocX:不需要安装word软件,通过C#操作word文件。

SharpSerializer:开源XML和、二进制、JSON、压缩和优化框架。

反射和动态语言

Clay dynamic:开源的动态语言dynamic框架让您形如javascript的方式创建对象。

ExposedObject:在类的外部通过动态语言dynamic的方式访问私有成员。

PrivateObject:微软单元测试框架中便捷在外部调用类内部私有成员的一个类。

跨平台和运行时解决方案

MONO.NET:跨平台的.NET运行环境,让.NET跨平台运行成为可能。

DotGnu Portable.NET:类似于MONO.NET的跨平台运行时。

Phalanger:将PHP编译成.NET,可实现PHP与.NET互操作。

VMDotNet:中国移动飞信所使用过的.NET运行时。

Unity3D:微软大力支持的机遇C#和JavaScript的跨平台游戏开发框架。

Cassini、IIS Express和Cassinidev:开源的ASP.NET执行环境。

Katana:微软基于OWIN规范实现的非IIS寄宿ASP.NET和MVC等。

IKVM.NET:基于.NET的JAVA虚拟机,让JAVA运行在.NET之上。

WEB开发和设计

Jumony Core:基于.NET开发的HTML引擎。

Microsoft.mshtml.dll、Winista.HtmlParser.dll 和 HtmlAgilityPack.dll:解析处理HTML文档的框架。

JavaScript.NET和ClearScript(微软出品):基于.NET开发的JavaScript引擎。

NCrawler:其HTML处理引擎htmlagilitypack的的开源网络爬虫软件。

AntiXSS:微软官方预防跨站XSS脚本入侵攻击的开源类库,它通过白名单机制进行内容编码。

YUICompressor.NET、Microsoft Ajax Minifier 和 Google Closure Compiler:JavaScrip和CSS压缩器。

NancyFx:是一个不错的轻量级开源.NET WEB框架。如果想快速做个简单的WEB应用。

AspNetPager:国内知名的ASP.NET分页控件,支持多种分页方式。

NOPI.dll:导出Excel报表的插件(基于微软OpenXml实现)(nopi.css.dl通过css设置样式)

Enterprise Library:微软针对企业级应用开发的最佳实践组件。

PowerCollections:国外一个牛人写的高级开源集合。

移动互联网和云计算

PushSharp:通过.NET向各种移动平台推送消息。

mono for android:用.NET语言开发安卓应用:

MonoTouch:用.NET语言开发IOS应用。

PhoneGap和AppCan:跨平台基于HTML5的移动开发平台。

Cordova:PhoneGap贡献给Apache后的开源项目,是驱动PhoneGap的核心引擎。

网络通信和网络协议

SuperSocket:基于.NET轻量级的可扩展的Socket开发框架。

SuperWebSocket:通过.NET实现TML5 WebSocket框架。

XProxy:支持插件的基础代理程序集,内置NAT、加解密、反向、直接和间接代理。

图形和图像处理框架

Paint.NET:基于.NET小巧灵活强大的图形处理开源项目。

Imagemagick.NET:用C#对开源图像处理组件Imagemagick的封装。

Skimpt:基于.NET开源的屏幕截图软件。

ImageGlue.NET:商业的图像处理组件,支持的格式列了一大堆。

Sprite and Image Optimization Framework:微软CSS精灵,多图合成一张大图和CSS样式。

桌面应用程序框架

DevExpress:一个全球知名的桌面应用程序UI控件库。

Prism:微软开发的针对WPF和Silverlight的MVVM框架,通过功能模块化的思想,来讲复杂的业务功能和UI耦合性进行分离。

WPFToolkit 和 Fluent Ribbon Control Suite:开发类似于Office风格的Ribbon菜单。

测试和性能评估方面

Faker.Net:方便生成大批量测试数据的框架。

Nunit:一个轻量级的单元测试框架。

Moq:非常流行的Mock框架,支持LINQ,灵活且高性能。

xUnit:比NUnit更好的单元测试框架,升级改进版的Nunit框架。

MiniProfiler和Glimpse:基于MVC的两款性能事件监控框架。

事务和分布式事务支持

KtmIntegration:一个支持NTFS文件系统的事务开源类。

NET Transactional File Manager:对文件系统操作(复制、移动和删除)加入事务支持。

分词、全文检索和搜索引擎

Lucene.net:流行高性能的全文索引库,可用于为各类信息提供强大的搜索功能。

Lucene.Net.Analysis.PanGu:支持Lucene.Net最新版的盘古中文分词扩展库。

数据验证组件整理

FluentValidation for .NET:基于LINQ表达式方法链Fluent接口验证组件。

Microsoft.Practices.EnterpriseLibrary.Validation.dll:微软企业库验证程序块。

CuttingEdge.Conditions:基于Fluent接口方法练接口的契约编程组件。

DotNetOpenAuth:让网站具备支持OpenID、OAuth、InfoCard等身份验证的能力。

开源图表统计控件:

Visifire:一套效果非常好的WPF图表控件,支持3D绘制、曲线、折线、扇形、环形和梯形。
SparrowToolkit:一套WPF图表控件集,支持绘制动态曲线,可绘制示波器、CPU使用率和波形。
DynamicDataDisplay:微软开源的WPF动态曲线图,线图、气泡图和热力图。

 

可以扩充消息队列类别,如:Kafka是一种分布式的,基于发布/订阅的消息系统。主要设计目标如下:
以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间复杂度的访问性能。
高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条以上消息的传输。
支持Kafka Server间的消息分区,及分布式消费,同时保证每个Partition内的消息顺序传输。
同时支持离线数据处理和实时数据处理。
Scale out:支持在线水平扩展。
RabbitMQ
RabbitMQ是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正因如此,它非常重量级,更适合于企业级的开发。同时实现了Broker构架,这意味着消息在发送给客户端时先在中心队列排队。对路由,负载均衡或者数据持久化都有很好的支持。
Redis
Redis是一个基于Key-Value对的NoSQL数据库,开发维护很活跃。虽然它是一个Key-Value数据库存储系统,但它本身支持MQ功能,所以完全可以当做一个轻量级的队列服务来使用。对于RabbitMQ和Redis的入队和出队操作,各执行100万次,每10万次记录一次执行时间。测试数据分为128Bytes、512Bytes、1K和10K四个不同大小的数据。实验表明:入队时,当数据比较小时Redis的性能要高于RabbitMQ,而如果数据大小超过了10K,Redis则慢的无法忍受;出队时,无论数据大小,Redis都表现出非常好的性能,而RabbitMQ的出队性能则远低于Redis。
ZeroMQ
ZeroMQ号称最快的消息队列系统,尤其针对大吞吐量的需求场景。ZeroMQ能够实现RabbitMQ不擅长的高级/复杂的队列,但是开发人员需要自己组合多种技术框架,技术上的复杂度是对这MQ能够应用成功的挑战。ZeroMQ具有一个独特的非中间件的模式,你不需要安装和运行一个消息服务器或中间件,因为你的应用程序将扮演这个服务器角色。你只需要简单的引用ZeroMQ程序库,可以使用NuGet安装,然后你就可以愉快的在应用程序之间发送消息了。但是ZeroMQ仅提供非持久性的队列,也就是说如果宕机,数据将会丢失。其中,Twitter的Storm 0.9.0以前的版本中默认使用ZeroMQ作为数据流的传输(Storm从0.9版本开始同时支持ZeroMQ和Netty作为传输模块)。
ActiveMQ
ActiveMQ是Apache下的一个子项目。 类似于ZeroMQ,它能够以代理人和点对点的技术实现队列。同时类似于RabbitMQ,它少量代码就可以高效地实现高级应用场景。
Kafka/Jafka
Kafka是Apache下的一个子项目,是一个高性能跨语言分布式发布/订阅消息队列系统,而Jafka是在Kafka之上孵化而来的,即Kafka的一个升级版。具有以下特性:快速持久化,可以在O(1)的系统开销下进行消息持久化;高吞吐,在一台普通的服务器上既可以达到10W/s的吞吐速率;完全的分布式系统,Broker、Producer、Consumer都原生自动支持分布式,自动实现负载均衡;支持Hadoop数据并行加载,对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka通过Hadoop的并行加载机制统一了在线和离线的消息处理。Apache Kafka相对于ActiveMQ是一个非常轻量级的消息系统,除了性能非常好之外,还是一个工作良好的分布式系统。

Advertisements

Winform按键实现无焦点效果

在Winform控件中,当按键获取到了焦点时会出现黑色的边框,影响整体界面的美观。可以通过下列代码实现控件无焦点效果

using System.Reflection;
private void SetButton(Button button)
{
    MethodInfo methodinfo = button.GetType().GetMethod("SetStyle", 
                BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod);
    methodinfo.Invoke(button,
                BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod,
                null, new object[] { ControlStyles.Selectable, false }, Application.CurrentCulture);
}

 

点击后不得到焦点且不影响当前焦点所在位置,类似系统计算器中按钮的效果。

可以实现无焦点的按钮、复选框、单选框等控件。

Winform窗体显示或关闭时,动画效果

[DllImport("user32")]
 private static extern bool AnimateWindow(IntPtr hwnd, int dwTime, int dwFlags);        

/****下面是可用的常量,按照不合的动画结果声明本身须要的***/
//自左向右显示窗口,该标记可以在迁移转变动画和滑动动画中应用。应用AW_CENTER标记时忽视该标记
private const int AW_HOR_POSITIVE = 0x0001;
//自右向左显示窗口,该标记可以在迁移转变动画和滑动动画中应用。应用AW_CENTER标记时忽视该标记
private const int AW_HOR_NEGATIVE = 0x0002;
//自顶向下显示窗口,该标记可以在迁移转变动画和滑动动画中应用。应用AW_CENTER标记时忽视该标记
private const int AW_VER_POSITIVE = 0x0004;
//自下向上显示窗口,该标记可以在迁移转变动画和滑动动画中应用。应用AW_CENTER标记时忽视该标记该标记
private const int AW_VER_NEGATIVE = 0x0008;
//若应用了AW_HIDE标记,则使窗口向内重叠;不然向外扩大
private const int AW_CENTER = 0x0010;
//隐蔽窗口 
private const int AW_HIDE = 0x10000;
//激活窗口,在应用了AW_HIDE标记后不要应用这个标记
private const int AW_ACTIVE = 0x20000;

//应用滑动类型动画结果,默认为迁移转变动画类型,当应用AW_CENTER标记时,这个标记就被忽视
private const int AW_SLIDE = 0x40000;
//应用淡入淡出结果 
private const int AW_BLEND = 0x80000;

protected override void WndProc(ref Message m)
{
    switch (m.Msg)
    {
        case 0x18://窗体显示
            AnimateWindow(this.Handle, 800, AW_SLIDE | AW_ACTIVE | AW_VER_POSITIVE);
             break;
         case 0x10://窗体关闭
             AnimateWindow(this.Handle, 800, AW_BLEND | AW_HIDE | AW_VER_POSITIVE);
             break;
     }
     base.WndProc(ref m);
}

注意:此方法可能会于添加窗体阴影的方法冲突,导致阴影显示不出来。

Winform 窗体在FormBorderStyle属性为None时,实现窗体圆角效果

在winfom中窗体FormBorderStyle属性设置为None时,可能需要设置窗体为圆角是窗体更加美观。以下方法不仅可以用于窗体,还可以用于按键等控件,以下列举几个方法:

方法一、

[DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")]
private static extern IntPtr CreateRoundRectRgn
(
     int nLeftRect,
     int nTopRect,
     int nRightRect,
     int nBottomRect,
     int nWidthEllipse,//圆角
     int nHeightEllipse//圆角
);

//订阅窗体Paint事件
private void MessageForm_Paint(object sender, PaintEventArgs e)
{

    //_BoarderRaduis can be adjusted to your needs, try 15 to start.
    IntPtr ptr = CreateRoundRectRgn(0, 0, 
              this.Width, this.Height, 10,10);
    this.Region = Region.FromHrgn(ptr);
}

方法二、

private void SetReion(Control control)
{
     using (GraphicsPath path = CreatePath(
            new Rectangle(Point.Empty, control.Size), 
            4, RoundStyle.All, true))
     {
          Region region = new Region(path);
          path.Widen(Pens.White);
          region.Union(path);
          control.Region = region;
     }
}

public static GraphicsPath CreatePath(
           Rectangle rect, int radius, RoundStyle style, bool correction)
{
       GraphicsPath path = new GraphicsPath();
       int radiusCorrection = correction ? 1 : 0;
       switch (style)
       {
            case RoundStyle.None:
                 path.AddRectangle(rect);
                 break;
            case RoundStyle.All:
                 path.AddArc(rect.X, rect.Y, radius, radius, 180, 90);
                 path.AddArc(rect.Right - radius - radiusCorrection, rect.Y,
                      radius, radius, 270, 90);
                 path.AddArc(
                     rect.Right - radius - radiusCorrection,
                     rect.Bottom - radius - radiusCorrection,
                     radius, radius, 0, 90);
                 path.AddArc(
                     rect.X, rect.Bottom - radius - radiusCorrection,
                     radius, radius, 90, 90);
                 break;
             case RoundStyle.Left:
                  path.AddArc(rect.X, rect.Y, radius, radius, 180, 90);
                  path.AddLine(
                       rect.Right - radiusCorrection, rect.Y,
                       rect.Right - radiusCorrection, rect.Bottom - radiusCorrection);
                  path.AddArc(
                      rect.X, rect.Bottom - radius - radiusCorrection,
                      radius, radius, 90, 90);
                  break;
             case RoundStyle.Right:
                  path.AddArc(
                     rect.Right - radius - radiusCorrection, rect.Y,
                     radius, radius, 270, 90);
                  path.AddArc(
                     rect.Right - radius - radiusCorrection,
                     rect.Bottom - radius - radiusCorrection,
                     radius, radius, 0, 90);
                     path.AddLine(rect.X, rect.Bottom - radiusCorrection, rect.X, rect.Y);
                    break;
             case RoundStyle.Top:
                  path.AddArc(rect.X, rect.Y, radius, radius, 180, 90);
                  path.AddArc(
                        rect.Right - radius - radiusCorrection, rect.Y,
                        radius, radius, 270, 90);
                  path.AddLine(
                        rect.Right - radiusCorrection, rect.Bottom - radiusCorrection,
                        rect.X, rect.Bottom - radiusCorrection);
                 break;
             case RoundStyle.Bottom:
                    path.AddArc(
                        rect.Right - radius - radiusCorrection,
                        rect.Bottom - radius - radiusCorrection,
                        radius, radius, 0, 90);
                    path.AddArc(
                        rect.X, rect.Bottom - radius - radiusCorrection,
                        radius, radius, 90, 90);
                    path.AddLine(rect.X, rect.Y, rect.Right - radiusCorrection, rect.Y);
                    break;
             case RoundStyle.BottomLeft:
                  path.AddArc(
                        rect.X, rect.Bottom - radius - radiusCorrection,
                        radius, radius, 90, 90);
                  path.AddLine(rect.X, rect.Y, rect.Right - radiusCorrection, rect.Y);
                  path.AddLine(
                       rect.Right - radiusCorrection, rect.Y,
                      rect.Right - radiusCorrection,
                        rect.Bottom - radiusCorrection);
                  break;
             case RoundStyle.BottomRight:
                    path.AddArc(
                        rect.Right - radius - radiusCorrection,
                        rect.Bottom - radius - radiusCorrection,
                        radius, radius, 0, 90);
                    path.AddLine(rect.X, rect.Bottom - radiusCorrection, rect.X, rect.Y);
                    path.AddLine(rect.X, rect.Y, rect.Right - radiusCorrection, rect.Y);
                    break;
            }
      path.CloseFigure();
      return path;
}
public enum RoundStyle
{
    ///
    /// 四个角都不是圆角。
    ///
    None = 0, 
   ///
   /// 四个角都为圆角。 
   ///
   All = 1, 
   ///
   /// 左边两个角为圆角。 
   ///
   Left = 2, 
   ///
   /// 右边两个角为圆角。
   ///
   Right = 3, 
   ///
   /// 上边两个角为圆角。 
   ///
   Top = 4, 
   ///
   /// 下边两个角为圆角。 
   ///
   Bottom = 5, 
   ///
   /// 左下角为圆角。 
   ///
   BottomLeft = 6, 
   ///
   /// 右下角为圆角。 
   ///
   BottomRight = 7,
 }

Winform 窗体在FormBorderStyle属性为None时,实现拖拽放大缩小。以及阴影效果

在使用winform设计窗体的时,很多时候需要将FormBorderStyle属性设置为None,才能设计出符合要求的好看窗体。当该属性为None是窗体将失去默认的放大缩小功能。同时窗体也会失去阴影效果。

实现窗体拖拽

方法1、在窗体右下角设置一个控件,例如是个Button,样式控制和背景色一样。鼠标放上去的时候,将鼠标样式改为拖拽样式。具体代码参考如下:

Point point = new Point(0, 0);
int width = 0;
int height = 0;
private void button2_MouseDown(object sender, MouseEventArgs e)
{
   if (e.Button == MouseButtons.Left)
   {
      point = e.Location;
      width = this.Width;
      height = this.Height;
      isMouseDown = true;
    }
}
private void button2_MouseMove(object sender, MouseEventArgs e)
{
    if (isMouseDown)
    {
        this.Width = width + (e.Location.X - point.X);
        this.Height = height + (e.Location.Y - point.Y);
        button2.Visible = false;
     }
}
private void button2_MouseUp(object sender, MouseEventArgs e)
{
    // 修改鼠标状态isMouseDown的值
    // 确保只有鼠标左键按下并移动时,才移动窗体
    if (e.Button == MouseButtons.Left)
    {
        isMouseDown = false;
        button2.Location = new Point(Width - 10, Height - 10);
        button2.Visible = true;
     }
}

方法二、调用底层实现

      
private const int cGirp = 16;
private const int cCaption = 32;

protected override void WndProc(ref Message m)
{
     if (m.Msg == 0x84)
     {
         Point pos = new Point(m.LParam.ToInt32());
         pos = this.PointToClient(pos);
         if (pos.Y < cCaption)                     
         {                                  
             m.Result = (IntPtr)2;                                 
             return;               
          }               
          if (pos.X >= this.ClientSize.Width - cGirp
               && pos.Y >= this.ClientSize.Height - cGirp)
          {
               m.Result = (IntPtr)17;
                 return;
          }
    }
    base.WndProc(ref m);
}

窗体阴影效果

方法一、简单处理,但是只有右边和下边会出现阴影

private const int CS_DropShadow = 0x00020000;

protected override CreateParams CreateParams
{
     get
     {
          CreateParams cp = base.CreateParams;
          cp.ClassStyle = CS_DropShadow;

            return cp;
      }
}

放法二、该方法可以实现四边都有阴影,但只适用于直角窗体。对于圆角窗体会多出现边边角角

 private const int WM_NCHITTEST = 0x84;
 private const int HTCLIENT = 0x1;
 private const int HTCAPTION = 0x2;
 private bool m_aeroEnabled;
 private const int CS_DROPSHADOW = 0x00020000;
 private const int WM_NCPAINT = 0x0085;
 private const int WM_ACTIVATEAPP = 0x001C;
 [DllImport("dwmapi.dll")]
 public static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS pMarInset);
 [DllImport("dwmapi.dll")]
 public static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize);
 [DllImport("dwmapi.dll")]
 public static extern int DwmIsCompositionEnabled(ref int pfEnabled);

 public struct MARGINS                          
 {
     public int leftWidth;
     public int rightWidth;
     public int topHeight;
     public int bottomHeight;
 }
 protected override CreateParams CreateParams
 {
     get
     {
        m_aeroEnabled = CheckAeroEnabled();
        CreateParams cp = base.CreateParams;
        if (!m_aeroEnabled)
            cp.ClassStyle |= CS_DROPSHADOW;
         return cp;
     }
 }
 private bool CheckAeroEnabled()
 {
     if (Environment.OSVersion.Version.Major >= 6)
     {
        int enabled = 0;
        DwmIsCompositionEnabled(ref enabled);
        return (enabled == 1) ? true : false;
      }
      return false;
  }
  protected override void WndProc(ref Message m)
  {
     switch (m.Msg)
     {
         case WM_NCPAINT:                        
             if (m_aeroEnabled)
             {
                var v = 2;
                DwmSetWindowAttribute(this.Handle, 2, ref v, 4);
                MARGINS margins = new MARGINS()
                {
                    bottomHeight = 1,
                    leftWidth = 0,
                    rightWidth = 0,
                    topHeight = 0
                };
                DwmExtendFrameIntoClientArea(this.Handle, ref margins);

             }
             break;
         default:
             break;
       }
       base.WndProc(ref m);
       // drag the form
       //if (m.Msg == WM_NCHITTEST && (int)m.Result == HTCLIENT)     
       //    m.Result = (IntPtr)HTCAPTION;
 }

 

方法三、使用层叠窗口创建阴影效果。具体代码参考下列链接

链接: https://pan.baidu.com/s/1KbEwPd5FhUXlCeYw-a-hhA

提取码: 3wgy

需求文档格式模板

引言

1.1 编写目的

· 阐明开发本软件的目的;

1.2 项目背景

· 标识待开发软件产品的名称、代码;

· 列出本项目的任务提出者、项目负责人、系统分析员、系统设计员、程序设计员、程序员、资料员以及与本项目开展工作直接有关的人员和用户;

· 说明该软件产品与其他有关软件产品的相互关系。

1.3 术语说明

列出本文档中所用到的专门术语的定义和英文缩写词的原文。

1.4 参考资料(可有可无)

列举编写软件需求规格说明时所参考的资料,包括项目经核准的计划任务书、合

同、引用的标准和规范、项目开发计划、需求规格说明、使用实例文档,以及相关产品

的软件需求规格说明。

在这里应该给出详细的信息,包括标题、作者、版本号、发表日期、出版单位或资

料来源。

2.项目概述

2.1 待开发软件的一般描述

描述待开发软件的背景,所应达到的目标,以及市场前景等。

2.2 待开发软件的功能

简述待开发软件所具有的主要功能。为了帮助每个读者易于理解,可以使用列表或

图形的方法进行描述。使用图形表示,可以采用:

· 顶层数据流图;

· 用例UseCase图;

· 系统流程图;

· 层次方框图。

2.3 用户特征和水平(是哪类人使用)

描述最终用户应具有的受教育水平、工作经验及技术专长。

2.4 运行环境

描述软件的运行环境,包括硬件平台、硬件要求、操作系统和版本,以及其他的软

件或与其共存的应用程序等。

2.5 条件与限制

给出影响开发人员在设计软件时的约束条款,例如:

· 必须使用或避免使用的特定技术、工具、编程语言和数据库;

· 硬件限制;

· 所要求的开发规范或标准。

3.功能需求

3.1 功能划分

列举出所开发的软件能实现的全部功能,可采用文字、图表或数学公式等多种方法

进行描述。

3.2 功能描述

对各个功能进行详细的描述。

4.外部接口需求

4.1 用户界面

对用户希望该软件所具有的界面特征进行描述。以下是可能要包括的一些特征:

· 将要采用的图形用户界面标准或产品系列的风格;

· 屏幕布局;

· 菜单布局;

· 输入输出格式;

· 错误信息显示格式;

建议采用RAD开发工具, 比如Visio,构造用户界面。

4.2 硬件接口

描述系统中软件产品和硬件设备每一接口的特征,以及硬件接口支持的设备、软件与硬件接口之间,以及硬件接口与支持设备之间的约定,包括交流的数据和控制信息的性质以及所使用的通信协议。

4.3 软件接口

描述该软件产品与其有关软件的接口关系,并指出这些外部软件或组件的名字和版本号。比如运行在什么操作系统上,访问何种类型的数据库,使用什么数据库连接组件,和什么商业软件共享数据等。

4.4 通信接口

描述和本软件产品相关的各种通信需求,包括电子邮件、Web浏览器、网络通信协议等。

4.5 故障处理

对可能的软件、硬件故障以及对各项性能而言所产生的后果进行处理。

5.性能需求

5.1 数据精确度

输出结果的精度。

5.2 时间特性

时间特性可包括如下几方面

·响应时间;

·更新处理时间;

·数据转换与传输时间;

·运行时间等。

5.3 适应性

在操作方式、运行环境、与其他软件的接口以及开发计划等发生变化时,软件的适应能力。

6.其他需求

列出在本文的其他部分未出现的需求。如果不需要增加其他需求,可省略这一部分。

7.数据描述

7.1 静态数据

7.2 动态数据

包括输入数据和输出数据。

7.3 数据库描述

给出使用数据库的名称和类型。

7.4 数据字典

对于数据流图、层次方框图中出现的所有图形元素在数据字典中都要作为一个词条加以定义,使得每一个图形元素都有唯一的一个清晰明确的解释。

数据字典中所有的定义必须是严密的、精确的,不可有二意性。

7.5 数据采集

·列出提供输入数据的机构、设备和人员

·列出数据输入的手段、介质和设备;

·列出数据生成的方法、介质和设备。

8.附录

包括分析模型,待定问题图表等。

C# 配置文件读取

配置文件介绍

在.net 开发中有些数据要写在配置文件中,winform中配置文件为App.config,web中配置文件为Web.config。
一般我们需要读取的数据分别在两个节点中,connectionStrings和appSettings。当然还有些其他的配置信息。

  • connectionStrings存放数据库连接字符串。
  • appSettings存放程序的一些自定义配置

 

配置文件读取

想要读取配置文件很多方法,比如可以直接把他当作一个xml文件读取出来,然后找到自己想要的配置。
.net 也给我们提供了简单的获取方法。

首先需要先引用一个dll文件,System.Configuration.dll。

然后使用该程序集中的ConfigurationManager.ConnectionStrings 和 ConfigurationManager.AppSettings就可以获取中两个节点的配置信息。

如:ConfigurationManager.ConnectionStrings[“conn”] 的值是 “this is connection string”
ConfigurationManager.AppSettings[“key1”] 的值是 “value1”