一切福田,不離方寸,從心而覓,感無不通。

使用C#开发ActiveX控件全攻略

转自:http://lwchome.spaces.live.com/blog/cns!791B533443007D37!234.entry   前言: 这段时间因为工作的需要,研究了一下ActiveX控件。总结如下: 先说说ActiveX的基本概念。 根据微软权威的软件开发指南MSDN(Microsoft Developer Network)的定义,ActiveX插件以前也叫做OLE控件或OCX控件,它是一些软件组件或对象,可以将其插入到WEB网页或其它应用程序中。 ActiveX是Microsoft对于一系列策略性面向对象程序技术和工具的称呼,其中主要的技术是组件对象模型(COM)。在有目录和其它支持的网络中,COM变成了分布式COM(DCOM)。在创建包括ActiveX程序时,主要的工作就是组件,一个可以自足的在ActiveX网络(现在的网络主要包括Windows和Mac)中任意运行的程序。这个组件就是ActiveX近控件。ActiveX是Microsoft为抗衡Sun Microsystems的JAVA技术而提出的,此控件的功能和JAVA applet功能类似。 目前支持ActiveX的主要是IE浏览器。 以前ActiveX开发普遍使用VC++或VB,随着C#和.net的发布,用C#开发ActiveX控件变得更方便、更简单。但需要注意的是用C#开发 的ActiveX控件需要客户机装有.net framework,有点郁闷。可是相对.net强大的功能良好的易用性,这点牺牲还是值得的,况且现在好多计算机已经安装有.net framework了。 其实.net下的winform控件也是可以直接嵌入到web网页里的,但是由于.net安全性的限制,无法在客户端实现复杂的操作,比如磁盘空间操作和注册表操作。因为ActiveX控件是以本地用户的身份运行,可以突破.net安全性的限制,所以开发ActiveX控件还是很必要的。 C#写ActiveX控件的原理很简单,就是使用了.net平台和COM的互操作性。修改项目属性的目的就是将.net控件注册为com。这样,你就可以把这个控件完全当作ActiveX控件来对待了。比如,可以使用JS和VBS来调用,也可以使用C++来调用。 下面一步步来实现C#写ActiveX控件。 第一部分:用vs2008制作一个winForm控件 用vs2008建立一个新的“windows窗体控件库”命名为“WindowsFormsControlLibrary1”如下图 点击确定后,将UserControl1.cs更名为demo.cs。向界面里添加一个Labal、一个TextBox和一个Button,相应的修改控件属性。如下图: 为button1添加Click事件,代码如下: private void button1_Click(object sender, EventArgs e) { label1.Text = textBox1.Text; } 在AssemblyInfo.cs中引用System.Security命名空间,并添加一句: [assembly : AllowPartiallyTrustedCallers()]   为类demo添加Attribute,[System.Runtime.InteropServices.Guid("A82F92E1-BA7F-3B32-B389-584E8AB4441F")]   好,现在编译整个工程,生成\bin\Debug\WindowsFormsControlLibrary1.dll,我们的winform控件就做好了。 下面在解决方案里添加一个web应用程序的工程,名为WebApplication1,用来测试我们的控件。 将WindowsFormsControlLibrary1.dll拷贝到WebApplication1所在的目录下。然后在Default.aspx 里面加入“<object id="helloworld" classid='http://localhost:59639/WindowsFormsControlLibrary1.dll#WindowsFormsControlLibrary1.demo' width="184" height="96" > </object> ok,编译运行后你将看到如下界面: 第二部分:把这个winForm控件转换为ActiveX控件 到目前为止,我们所实现的只是winform控件,还不是真正的ActiveX控件。 鼠标右键,打开WindowsFormsControlLibrary1的工程属性,在“应用程序”里点击“程序集信息…”显示如下界面: 选中“使程序集COM可见”,然后确定。 进入“生成”页面,如下图: 选中“为COM互操作注册”。   重新编译工程,这时WindowsFormsControlLibrary1.dll就变成了一个ActiveX控件。 如果编译时,提示你权限不够(Windows 7 UAC),需要以管理员运行Visual Studio。 如果编译时,The assembly could not be converted to a type library. Type library exporter encountered an error while processing 'xxxxxx'. Error: 找不到元素. 你在Relase 下进行编译。 编译成功后,可以在注册表项HKEY_CLASSES_ROOT\WindowsFormsControlLibrary1.Demo […]

龙生   12 May 2015
View Details

C# 开发Activex

由于要在网页上显示Tree的结构,开始使用JQuery的Tree,但是当资料量很大时会导致第一次加载很慢。(特别慢,资料量太大了网页一下还反映不过来),于是改用JQuery的FileTree的插件,每层通过ajax的方式到后台获取资料,结果还好,不过当资料量大的时候,频繁的点击页面,反映也会很慢,而且要求Client的配置好些,而这边的site上帝配置都比较低,有的机器会导致无反映的情况。无奈改用Activex的方式吧。对vc不是特别的熟悉,于是选择了C#,因为site上的每个Client都会有.net Framework。OK..开始改写。 主要参考:http://www.codeproject.com/KB/cs/CreateActiveXDotNet.aspx 1.创建类库工程 2.添加一个UserControl,AxTree 3.定义AxTree Class的属性 [ProgId("MyTreeActiveX.AxTree")] [Guid("A5C532BA-45B2-44c7-ACAE-D526EF9D47B0")] [ComVisible(true)] [ClassInterface(ClassInterfaceType.AutoDual)] [ComSourceInterfaces(typeof(ControlEvents))] public partial class AxTree : UserControl, IObjectSafety 说明: ComVisible:是否可以见 ComSourceInterfaces:该Activex实现的事件的类 IObjectSafety:继承与该接口,标记安全,否则在生产Activex后,和网页交互还需要对ie进行设定。 [ Serializable, ComVisible(true) ] public enum ObjectSafetyOptions { INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001, INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002, INTERFACE_USES_DISPEX = 0x00000004, INTERFACE_USES_SECURITY_MANAGER = 0x00000008 } [ ComImport(), Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown) ] public interface IObjectSafety { [PreserveSig] long GetInterfaceSafetyOptions(ref Guid iid, out int pdwSupportedOptions, out int pdwEnabledOptions); [PreserveSig] long SetInterfaceSafetyOptions(ref Guid iid, int dwOptionSetMask, int dwEnabledOptions); }; 4.添加方法,属性 [ComVisible(true)] public string Leve1ColorRGB{get..set…} 方法和属性添加 [ComVisible(true)] 就好 5.添加Event 写一个Event的接口,ControlEvent [ComVisible(true)] [Guid("5F6E5E2D-8C6D-4524-AD44-E8B169D90371")] [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public […]

龙生   12 May 2015
View Details

[转]老菜鸟致青春,程序员应该选择java 还是 c#

致青春 还记得自己那年考清华失败,被调剂到中科大软院,当初有几个方向可以选,软件设计、嵌入式、信息安全等等,毫不犹豫地选择了信息安全。 为什么选信息安全?这四个字听起来多牛多有感觉,我本科是学物理的,记得做一个光学实验的时候,一个老师看我做的结果,说,学物理不是什么人都可以的,这个是需要一点智商的。 好吧,当初其实并非对我一个人所说,但我确实感觉到受到了鄙视,同时,我没有任何在物理上的精湛技艺可以反击我的老师。 由于整个大学期间,我都在沉迷游戏和小说,以至于辅导员说,现在找你都得预约。 而我的同学基本在学期开始和考试前能见到我,当时为了应付考试,我不得不学习复杂的物理公式和推导,有一门课程是激光原理,老师是双博士学位,大概是很厉害的,在我考试时,过来看我的卷子,说你的”背功“很厉害。 考试时如期通过,但老师大概都对我评价不高。自然,我是感到不愉快的。 回到我的毕业论文,大概是做一个电离层特征参量的反演,其实就是用迭代法解病态方程。 这个论文基本是没有人选的,因为题目本身可能相对比较难,也需要编程实现,好吧,当时下载的是盗版的matlab,参考的是一个日本学者和我导师的论文,铿铿锵锵地写出来了。还做了个所谓的参数优化,以使得结果看起来更平滑。 当时觉得很得意,我女朋友(现在的老婆)也很惊讶,我一个月做完了。 其实这不是第一次领略程序的魅力,在很久之前,高中时期,为了追一个女生,我做过flash,当时我就觉得拖来拖去很麻烦,但苦于没有基础,看不懂actionscript,所以难以深入体会编程的精妙,如果看到网上有一些类似雪花飘落、旋转字等效果,都是直接拷贝修改到完工。 现在回到,为什么选择信息安全上来,因为在大学时,很喜爱游戏,尤爱单机,国情大家是清楚的,而且我没有钱,也不知道哪里可以买到正版,这个猥琐了,呵呵。 仙剑、上古、火炬之光、火焰纹章,各种类型都喜欢。也很喜欢生存类游戏。给一个单机游戏做的exe补丁和用lua拓展的mod至今看来仍让我怀念。 讨厌网游是因为自己没有钱,搞不过RMB玩家,而且砸装备总失败。 唯独一个,2006年时,我玩完美世界,后来玩它的SF,为了砸装备,我第一次想到写封包外挂,由于当时已经有一些socket、tcp/ip的概念了,虽然C++玩不转,还是各种参考,写hook、写字节转换,同时完美当时打击WG很厉害,游戏基址容易变,又加了很多防调试的功能。 但为了不手工砸装备(SF里的石头几乎免费,就是砸上去的几率太低),我欲望那个强啊,所以用OD调试找网络发送的函数地址, 然后C++写代码hook。 程序最终工作很好,我还分享给了几个玩友。 后面也写过一些类似跳舞自动击键的WG,主要也是为了自娱自乐,因为我真的反应不过来屏幕上瞬间出现太多的key! 与程序为伍的日子很少,但每一次接触,似乎都是为了达到自己的一些目标。 所以凌乱的编程体验,虽然不系统,不精湛,却让我快乐。 再次回到为什么选择信息安全上来?也许答案已经很清楚。 当时觉得虚拟机加密太高深了,联网解密也难搞定,所以觉得信息安全一定是能解决我的问题的! 后来你猜到了,就是C,就是汇编,就是linux,我当时是多么反感linux,当时还用的是ubuntu,但为了课程,实在是没有办法,为了考研,自己系统自学了数据结构、计算机网络、操作系统、组成原理,当时在考研论坛上还和一个清华搞计算机体系的探讨问题,刷了好几页的帖子,现在看来,多幼稚!但,快乐也是固定在那个过程之中了。 我讨厌汇编,我讨厌C,我讨厌linux,但他们强大,能够满足需求,这就够了。 java还是 c#? 其实这不应该是我们真正的主题,而且入了行的也很少会java还是c#这么比,但初学的,java和c#往往就代表了两大流派,java代替了j2ee,c#代替了.net,ok,没有关系,这么作为title,不影响我们说事。 如果从语言的角度上来讲,c#毫无疑问胜出,易用、门槛低、优雅、较为简洁。但java和c#的语言特性是相似的。 在很多类的命名上,它们都如出一辙: //java System.out.println("java比C#强!j-a-v-a!"); //C# System.Console.WriteLine("你没看到#是4个+吗,我比c++还强2个+,你就歇菜吧!"); c#出现的时间比java晚,所以自然吸收、借鉴,同时又有它的创新,比如很早就支持lamda表达式、比如event和委托,比如var,比如linq。 但如果从面向接口来讲,java同样可以做到event和listener,只不过对象引用的传递比较直接。 而.Net的类库和jdk则各有千秋。 如果从应用的角度来看,javaee和.Net体系几乎都涵盖了主流的开发方向: 桌面、Web、服务端、数据库、网络、移动端、中间件。 哪个方向,哪个更强?这个留给读者自己体会吧。 微软给.Net一个宇宙最强的IDE,也给了各个方向统一而平滑的编程体验,不得不说,微软的上手要容易的多。 而java则一开始就和开源分不开,多如牛毛的框架、引擎、包,blabla,用java开发,程序员要懂得东西更多一些。应为你大部分情况下得自己整合。但整合的好了就是很强大的,比如SSH。 在近几年很热的大数据和云计算领域,hadoop、spark、tez、leveldb、mongodb、mariadb、hive、hbase,还有oracle,都各自在自己不同的层面发力,大部分的这些都对java是极为友好的。 很多java程序员,都觉得搞.net开发的,就是拖拖控件而已,其实我可以告诉你,说出这种话的java程序员一般都还比较小白,如果你是搞.net的,你也可以说搞java的都是拷贝别人的开源软件的代码,然后改改而已。 当然改改没什么问题,谁都不喜欢重复造轮子,比如,google里面也并非全部是创新,经常”拿“别人的东西自己改吧改吧,淘宝就很不用说了,招了一些能改c、会点编译的程序员,经常拿各种开源框架开刀,然后表明是自己的东西。比如双11的那个问题。 当然不是说淘宝找的人有问题,而是这个企业的文化就是销售和广告文化,后来的google也如此。 回到正题,wpf和silverlight(虽然已经EOL)中最大的创新莫过于xaml技术,如果你认为wpf只是winform的简单升级,或者说你只会在wpf中拖控件,说明你还是一个非常初级的.net程序员,不管你工资上w没有,或者你已经是项目经理了。 xaml天生就是为mvvm模型而生,这一点,搞前端的同学,应该熟悉,即使你不懂wpf,js和html怎么做mvvm,你也应该体会过它的好处。 wpf中在xaml中布局控件,并支持INotifyPropertyChanged接口,可以非常容易的实现界面和数据分离,做出一个mvvm模型出来。 说到标记性语言,我们看看jsp的jstl、struts2的tags,还有asp.net mvc3之后的razor引擎: jstl和aspx的标签类似,自由、强大,可以很容易的穿插交织到html标记中; struts的标签就是个另类,我个人反感这种既不遵循主流标准也不简洁的东西,虽然好多人会说好用,那是个习惯问题,我这么说,不是说这东西难学难掌握,只是比较一下和razor引擎中的标签语法,弱爆了。 razor,强大、简洁、优雅。 你肯定觉得我是微软.net的粉丝,其实我想告诉你的是,最强的标签语言只有两种,html和xml,穿插动态语句到服务端页面上,然后刷出html,从来都不是好的做法,因为不只你一个人写代码,后面可能会有其他人维护这个页面,本来这是需要由web designer来做的事情,但是有了语句,他的维护成本就很高。 规范的页面开发,程序员是不会染指一个css、style的,动态语言在aspx、view、jsp上面应该尽量少用。否则你不如使用php和asp。 这一点,你会在工作中会深有体会的。 青春的你,怎么选择? 看看现在的招聘吧,动不动就是 精通j2ee,精通struts、spring mvc、hibernate或者mybatis,对mysql、oracle有深入理解,精通webservice、精通多线程,能处理高并发,有的还得懂jvm,最好有hadoop等开发经验。最后再来个211以上。 .net方面呢? 精通.Net,精通mvc3-5、精通wpf、wcf、多线程,mssql等等等等。 我现在处于离职状态,所以每天收到猎聘上的一些推荐,都很郁闷,因为没有一项是我精通的。 但是不妨碍我在2012年实习中,就拿到了13K的月薪,比一些正式员工可能还要高。 而且,仔细想想,代码中经常讲到要容易维护、这个设计模式、那个AOP,这个大并发,那个高性能,我个人没有见到容易维护的代码。学习一个新公司的一套模式,一套老产品,比学习一门新技术需要的时间长得多,你会发现,99%的情况下,你最需要的,不是什么代码,模式,而是对产品的理解、对业务的理解,很多情况下,除非太菜太小白,大家的代码都差不多,谁有时间重构代码?程序员又为何加班? 这是行情,一个项目接一个项目,公司需要挣钱的,这是大部分公司的现状。 为了回答java还是c#的问题,我会从我的经历提供一些参考,既然是我的,那就不会是全面的和准确的,你自己判断。 还是从故事开始吧! 在科大软院(苏州),因为老婆想和我一起在外面过个年,我不得不去临时找实习,当时c和汇编不行啊,所以得选个流行的,什么流行呢,当时是web。 所以我遇到了java还是c#的问题,确切的是我遇到了j2ee还是.net的问题。 因为经常使用windows,又因为.net门槛如此低,所以毫不犹豫选择了.net,当时是不会写SQL的,但是却系统学习了数据库设计原理。 进入公司就接触mvc3,觉得好,外企的技术确实比较新呢,比我学习.net时学的aspx优雅,那个时候开始接触并尝试理解mvc模式和ddd的概念。 当时,时薪25人民币。 6个月的实习,基本能玩javascript和c#,然后sql还是不行,当时记得一个高级开发跟我说,他以前做delphi开发的时候,团队写sql写的好就牛,我深以为然。 只会用Entityframework + mvc3 + javascript,开发网站的我,用理解很浅的.net的web技术体系,支撑了我和老婆在上海的生活费用,当时10年,我们租的拎包式入住公寓1500一个月,不算生活费、水电费。 再一次,通过一项技术,达到了我的目标,支撑了我的计划,当时对技术的理解,但是偏执于.Net,对java阵营是不屑一顾的。 后来很快离开了科大软院和苏州,考取了中科院,到了北京,房租是1580一个月,照样不算生活费、水电费。 没办法,学校发的补贴根本不够押2付3的。 找实习,做过什么呢?office编程,而且当时的老板是从IBM下来的工程师,项目主要是java开发,jsf做页面,招我过去,做word编程,还不能使用.net,你猜到了,我用的是vba。 没做多久,公司发钱就开始拖延,两周后,我没有积蓄,只能被迫离职,后来加入一家公司,从4K到10k,用了8个月,在这里,我完善了程序员生涯中sql能力的快速成长,并且广泛地使用了silvelight、aspx、oracle、mssql技术。记得当时一个北邮毕业的同事,做了6个月的office文档在web展示,因为涉及到了com编程,所以运行非常不稳定也难于调试,更重要的是,拉一个页面到展示,需要20秒。 老板是中科院软件所的博士,架构很厉害,但对于这个技术细节并不擅长,问我有没有办法,我说做过vba,大概了解word的dom结构,我试试。那个同事说,如果你能做到稳定、快速的实现,你可以拿这个做你的毕业论文了。 我说,我试试。 […]

龙生   12 May 2015
View Details