随笔分类 - C#
摘要:现象:如果在外部已打开了一个或多个Word,之后在程序中创建了新的文档,关闭Word时会弹出 "此文件正由另一个应用程序或用户使用"原因:多个word exe不能用时用.dot模板解决方法:1、在程序中直接关闭时(如直接打印到打印机)可以加上如下参数值,即可:object saveOption = Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges;_wordDoc.Close(ref saveOption, ref missing, ref missing);_wordApp.Quit(ref sa
阅读全文
摘要:/// <summary> /// 输出到打印机 /// </summary> public void Print() { //不弹出警告框,主要针对“第一节的页边距设于可打印区域之外,是否继续” _wordApp.Options.PrintBackground = false;//主要是加上这一代码,网上很多都没有。导致仍然弹出警告 _wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone; object missing = System.Reflection.Missing.Value; _wordDoc.PrintOut
阅读全文
摘要:int h, w; //w = System.Windows.Forms.Screen.GetWorkingArea(this).Width; //h = System.Windows.Forms.Screen.GetWorkingArea(this).Height; h = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height; w = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width; gt.FormBorderStyle = FormBorderStyle.None; .
阅读全文
摘要:部分分隔符和条件格式可以根据值为正、为负还是为零来为字符串应用不同的格式化。为产生这种行为,自定义格式字符串可以包含最多三个用分号分隔的部分。下表描述了这些部分。部分数目说明一个部分格式字符串应用于所有值。两个部分第一部分应用于正值和零,第二部分应用于负值。如果要格式化的数字为负,但根据第二部分中的格式舍入后为零,则最终的零根据第一部分进行格式化。三个部分第一部分应用于正值,第二部分应用于负值,第三部分应用于零。第二部分可以留空(分号间没有任何内容),在这种情况下,第一部分应用于所有非零值。如果要格式化的数字为非零值,但根据第一部分或第二部分中的格式舍入后为零,则最终的零根据第三部分进行格式化
阅读全文
摘要:--内容摘要:.NET Framework 3.5提供了一个框架,即System.Addin命名空间,通过该命名空间我们可以进行插件开发,用程序集System.AddIn来保存和创建插件。 这个框架也称为Managed AddIn Framework(MAF)。 插件还有其他称呼,如add-on或plug-in。 先前研究过Sharp....NET Framework 3.5提供了一个框架,即System.Addin命名空间,通过该命名空间我们可以进行插件开发,用程序集System.AddIn来保存和创建插件。这个框架也称为Managed AddIn Framework(MAF)。 ...
阅读全文
摘要:C#接口是一个让很多初学C#者容易迷糊的东西,用起来好像很简单,定义接口,里面包含方法,但没有方法具体实现的代码,然后在继承该接口的类里面要实现 接口的所有方法的代码,但没有真正认识到接口的作用的时候就觉得用接口是多此一举,当然你这样想那是绝对绝对错误的,比尔盖茨的微软请的员工都是比盖茨还 聪明的人,他们的C#能添这样的多足吗?!关于接口的作用,网上有一位就真的深入浅出给我们做了很好理解的分析。 我们定义一个接口publicinterfaceIBark{voidBark();}再定义一个类,继承于IBark,并且必需实现其中的Bark()方法publicclassDog:IBark{publi
阅读全文
摘要:阅读提示:这篇文章将讲述如何利用C#奇妙的特性,实现插件架构,用插件(plug-ins)机制建立可扩展的解决方案。在.NET框架下的C#语言,和其他.NET语言一样提供了很多强大的特性和机制。其中一些是全新的,而有些则是从以前的语言和平台上照搬过来的。 然而,这种巧妙的结合产生了一些有趣的方法可以用来解决我们的问题。这篇文章将讲述如何利用这些奇妙的特性,用插件(plug-ins)机制建立可扩展的 解决方案。后面也将提供一个简要的例子,你甚至可以用这个东西来替换那些已经在很多系统中广泛使用的独立的程序。在一个系统中,可能有很多程序经常需要进 行数据处理。可能其中有一个程序用于处理雇员的信息,而.
阅读全文
摘要:C#插件构架实战C# 插件构架实战 Jack H Hansen [ 2004-07-27 ] Keywords C# 插件 反射(System.Reflection) 属性(System.Attribute) 一、引言 1. 问题的引入 假设你设计的程序已经部署到用户的计算机上,并且能够正常运行了。但是有一天,用户打来了电话——他们要求增加新的功能。确定了用户的需求后,你竟然发现原有的软件架构已经无法胜任新增任务的需求——你需要重新设计这个应用了!但问题是,就算你又用了一个开发周期完成了用户需要的应用,却不能保证用户的需求不会再次变更。也就是说,需求蔓延的可能性依然存在。因此,这种情况下插件构
阅读全文
摘要:有时我们需要在窗体应用程序中同时启动控制台显示我们的程序运行情况等等,这个时候我们有两种解决方式: 1.项目->属性->应用程序->输出类型->控制台应用程序。 2.在form的cs文件添加如下代码: /// <summary> /// 控制台程序 /// </summary> public class ConsoleEx { /// <summary> /// 启动控制台 /// </summary> [DllImport("kernel32.dll")] public static extern b
阅读全文
摘要:关于Assembly.CreateInstance()与Activator.CreateInstance()方法动态创建类对象,大多是Activator.CreateInstance()和 Activator.CreateInstance<T>()方法,非常好用,一般都用了 Assembly.Load("AssemblyName").CreateInstance ("ClassName");的方法,研究一下这两者到底有什么区别,在msdn里,查到了两个方法的介绍:Assembly.CreateInstance 方法 (String)使用区分大
阅读全文
摘要:摘要:本文作者将给大家分享一下C#插件式程序开发经验,在共同讨论的过程中能共同进步。 在网上找了下插件式编程的资料,这里自己先借鉴下别人的,同时发现有自己的看法,不过由于本人水平有限,不一定有参考价值,写出来一方面是为了总结自己,以求提高,另一方面也希望各为朋友看到我的不足,给我提出宝贵意见。 什么是插件式编程 提起插件式,我们首先想到的是firefox, 用过firefox的人都知道它是一个插件式程序。当一个功能需要,完全可以从网上下载一个插件后,重启后,就能使用。这个功能给我们带来许多的方便之处,这就是插件式程序的好处。 插件的本质在于不修改程序主体(平台)的情况下对软件功能进行拓...
阅读全文
摘要:一、前言插件模型指应用程序由一些动态的独立模块构成,每个模块均具有一个或多个服务,并满足一定的插件协议,能够借助主程序实现主程序-插件,插件-插件之间的 通讯。它定义了一套公共的接口,通过接口与插件进行通信,主要是通过反射来获取相关的属性和方法,然后再执行指定的操作。其实,它也可以理解为定义一套通 用的解决方案,通过反射来获取相应的程序集的相关类型,然后执行这些指定类型的相关操作。它是一种即插即用的方案,更新及维护简便。本文仅仅是描述插件开发的大体模型,设计比较简单,主要的步骤如下:(1)、定义公共的接口以及抽象类。(2)、定义和实现相关组件。(3)、实现通用程序集反射操作类。其中,公共的接口
阅读全文
摘要:之前一直想学学插件编程,主要的原因是感到现在的客户需求变化不定,如果把全部功能整合在一个执行文件中的话,修改,升级起来很不方便,所以想采用 插件编程的方式,只需要构建好了程序框架之后,每完成一个功能,就可以让用户审核一个,化整为零,让开发团队和客户都能构掌握项目开发的进度.同 时大家通过这种方式,增强对项目按时完成的信心. 以下资料主要是从hahablog中获得的,从网上找了很多类似的资料,只有这个我觉得是比较适合初学者 复制 保存//1 定义插件接口,将其编译成 dll,例如:using System;namespace PluginInterface{public interface IS
阅读全文
摘要:C#实现渐变颜色的Windows窗体控件!1,定义一个BaseFormGradient,继承于System.Windows.Forms.Form2,定义三个变量:privateColor_Color1=Color.Gainsboro;privateColor_Color2=Color.White;privatefloat_ColorAngle=0f;3,重载OnPaintBackground方法protectedoverridevoidOnPaintBackground(PaintEventArgspevent){//GettingthegraphicsobjectGraphicsg=peve
阅读全文
摘要:对于C# 更改窗体外观感觉并不那么轻松 更改窗体外观涉及到使用GDI+ 我所知道的有两种方法:有系统边框的窗体 处理窗体的Paint方法,在paint方法中 参数e.Graphics属性将返回一个对象 用来作画 但是这个画布的区域是窗体的客户区 所以无法修改到窗体的标题栏 边框等位置的。要更改标题栏只有获取整个窗口的句柄 这样创建的画布是整个窗体区域 但是对于我这样的初学者来说 对于句柄 windowsAPI还很不熟悉 我相信大多数的初学者或者学生都和我有相同的困惑 所以我使用了第二种办法 无边框窗体无边框的窗体 把FormBorderStyle的属性设置为none 就去掉了边框 剩下的窗体客
阅读全文
摘要:建议3:区别对待强制转型与as和is 在阐述本建议之前,首先需要明确什么是强制转型,以及强制转型意味着什么。从语法结构上来看,类似下面的代码就是强制转型。secondType=(SecondType)firstType; 但是,强制转型可能意味着两件不同的事情: 1)FirstType和SecondType彼此依靠转换操作符来完成两个类型之间的转型。 2)FirstType是SecondType的基类。 类型之间如果存在强制转型,那么它们之间的关系,要么是第一种,要么是第二种,不能同时既是继承的关系,又提供了转型符。 首先看第一种情况,当FirstType和SecondType存在...
阅读全文
摘要:一:Task的优势ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便。比如:1: ThreadPool不支持线程的取消、完成、失败通知等交互性操作;2: ThreadPool不支持线程执行的先后次序;以往,如果开发者要实现上述功能,需要完成很多额外的工作,现在,FCL中提供了一个功能更强大的概念:Task。Task在线程池的基础上进行了优化,并提供了更多的API。在FCL4.0中,如果我们要编写多线程程序,Task显然已经优于传统的方式。以下是一个简单的任务示例:staticvoid Main(string[] args) ...
阅读全文
摘要:在命名空间System.Threading.Tasks下,有一个静态类Parallel简化了在同步状态下的Task的操作。Parallel主要提供了3个有用的方法:For、ForEach、Invoke。For方法,主要用于处理针对数组元素的并行操作,如下:staticvoid Main(string[] args){int[] nums =newint[] { 1, 2, 3, 4 };Parallel.For(0, nums.Length, (i) =>{Console.WriteLine("针对数组索引{0}对应的那个元素{1}的一些工作代码……",i, nums
阅读全文
摘要:在C#中让线程同步的另一种编码方式就是使用线程锁。所谓线程锁,就是锁住一个资源,使得应用程序只能在此刻有一个线程访问该资源。可以用下面这句不是那么贴切的话来理解线程锁的作用:锁,就是让多线程变成单线程。在C#中,可以将被锁定的资源理解成new出来的普通对象。既然需要锁定的资源就是一个C#中的对象,我们就该仔细思考,到底什么样的对象能够成为一个锁对象(也叫同步对象)?在选择同步对象的时候,应当始终注意以下几点: q同步对象在需要同步的多个线程中是可见的、同一个对象; q非静态方法中,静态变量不应作为同步对象;q值类型对象不能作为同步对象;q避免将字符串作为同步对象。q降低同步对象的可见
阅读全文
摘要:开发者总尝试对自己的代码有更多的控制。“让那个还在工作的线程马上停止下来”就是诸多要求中的一种。然而事与愿违,这里面至少存在两个问题:第一个问题是:正如线程不能立即启动一样,线程也并不能说停就停。无论采用何种方式通知工作线程需要停止,工作线程都会忙完手头最紧要的活,然后在它觉得合适的时候退出。以最传统的Thread.Abort方法为例,如果线程当前正在执行的是一段非托管代码,那么CLR就不会抛出ThreadAbortException,只有当代码继续回到CLR中时,才会引发ThreadAbortException。当然,即便是在CLR环境中,ThreadAbortException也不会立即引
阅读全文