??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品视频在线,亚洲国产精品xo在线观看,亚洲色在线无码国产精品不卡http://m.tkk7.com/smildlzj/category/33212.htmlLuLuzh-cnMon, 16 Mar 2009 13:52:33 GMTMon, 16 Mar 2009 13:52:33 GMT60C#中将dll汇入exeQƈ加壳 http://m.tkk7.com/smildlzj/articles/249903.htmlsmildlzjsmildlzjMon, 05 Jan 2009 05:44:00 GMThttp://m.tkk7.com/smildlzj/articles/249903.htmlhttp://m.tkk7.com/smildlzj/comments/249903.htmlhttp://m.tkk7.com/smildlzj/articles/249903.html#Feedback0http://m.tkk7.com/smildlzj/comments/commentRss/249903.htmlhttp://m.tkk7.com/smildlzj/services/trackbacks/249903.html

q几天在做自q一个小E序Q因Z用了3层架构,q行目录下有很多dll文gQ最l发布时Q我打算dll文g都合q到exe文g中去。微软发布的免费软gILmerge可以完成q项工作Q研I了一下,其用法如下:(x)

1、合qfile1.dll、file2.dll到destination.dll

ILmerge /ndebug /target:dll /out:C:\destination.dll /log C:\file1.dll C:\file2.dll

2、合qfile1.dll、file2.dll以及(qing)myApp.exe到newApp.exe

ILmerge /ndebug /target:winexe /out:C:\newApp.exe /log C:\myapp.exe C:\file1.dll C:\file2.dll

注意Q合qؓ(f)exeӞmyapp.exe必须写在file1.dll、file2.dll前面

完成之后Q就得到了一个exe文gQ如果想做一些邪恶的事情Q可以将一些破解Y件的dll合ƈC的exe中去。前提是Q所有的dll都是托管的,如果试合ƈC++写的dllQ则?x)失败。有一个工P叫做mergebin.exeQ可以合q托和非托dllQ用法我q没研究出来Q似乎比较困隄样子。这个工hADO.NET 2.0 Data Provider for SQLite的作者写的,他发布的System.Data.SQLite.dll可以被dotNetE序引用Q还可以直接被C/C++E序调用Q这个dll是托管和非托管混合的dllQ果然是很牛的!mergebin.exe在其源码包里Q有兴趣的朋友可以研I一下。这是其官方|站Qhttp://sqlite.phxsoftware.com

l箋邪恶的话题,如果你的exe里面合ƈ有破解的dllQ你可能不想让别人知道,或者你不想让别人反~译你的exe文g。؜淆Y仉收费Q而且h之后Ҏ(gu)q是看得见的Q只不过名字毫无规则Q没办法Q用不了。还是加x的直接,我们得找一Ƒ־牛的加壳软g。给大家推荐个YӞ叫做SixxpackQ专门加壳dotNetE序的,目前的最新版本ؓ(f)Sixxpack22Q要求机器上装有.netframework2.0以上版本。Sixxpack除了加壳Q还使用了压~技术,最高压~比?0%。Sixxpack是免费YӞ官网是:(x)http://www.reversers.net/

lSixxpack加壳后,用Reflector打开exe文gQ哈哈,看到的永q都只是一个actmp.dll的信息,其中包含4?zip命名I间?个Sixxpack命名I间Q反~出来这些东西对也没啥用处。呵呵,原来是用7zip压羃的,难怪那么高的压~比?/p>

有一个问题是Q用Sixxpack处理之后的程序集Q版本信息是0.0.0.0Q其他信息也不对。没关系Q用Resource Hacker修改一下就O(jin)K了! Resource Hacker也是免费软gQ官|是Qhttp://angusj.com/resourcehacker/

我这个小目Z化界面Q用了一些邪恶的东西Q最l的exe文g5MB左右Q用Sixxpack处理之后Q体U降C2MB以内Q运行时几乎没有性能损失。最重要的,很难反编译,可以攑ֿ拿给别h用了?/p>

smildlzj 2009-01-05 13:44 发表评论
]]>
Java&.Net虚拟机精http://m.tkk7.com/smildlzj/articles/247662.htmlsmildlzjsmildlzjSun, 21 Dec 2008 14:39:00 GMThttp://m.tkk7.com/smildlzj/articles/247662.htmlhttp://m.tkk7.com/smildlzj/comments/247662.htmlhttp://m.tkk7.com/smildlzj/articles/247662.html#Feedback0http://m.tkk7.com/smildlzj/comments/commentRss/247662.htmlhttp://m.tkk7.com/smildlzj/services/trackbacks/247662.html    _JRE体积的小工具Qhttp://blog.csdn.net/cping1982/archive/2008/09/02/2865198.aspx

   目地址Qhttp://code.google.com/p/greenvm/

   关键?JRE,_,压羃,JVM,JAVA.NET,虚拟?l色软g,最空?脱框,压羃,GREEN,GREENJVM

  
  
   9?日更新版本ؓ(f) 0.1.1.4

   变更Q?/strong>
  
    增加[SET_START_MAIN_CLASS_AUTO_LOAD]参数Q当此项为真ӞE序设|主函数所在类开动启动?br />
    增加初始化界面设|,参数如下Q?br />
  1. //E序启动前用初始界?此项为false?以下讑֮皆无?
  2. SET_START_INIT=true
  3. //使用的初始界面图?/span>
  4. SET_START_IMAGE=init.bmp
  5. //讄true时初始窗体将自动居中,同时top?qing)left无效
  6. SET_START_LOCATION_AUTO=true        
  7. // 讄初始H体在桌面的X?/span>
  8. SET_START_LOCATION_LEFT=100 
  9. // 讄初始H体在桌面的Y?/span>
  10. SET_START_LOCATION_TOP=100
  11. // 讑֮初始H体昄旉
  12. SET_START_TIME=1000

  

   PS:本文中所有关于JRE部分皆指Sun JRE?br />
   众所周知QJava能够q行于近乎所有的操作pȝQ包括Windows?Mac或Linux{等?br />
   对于Ml织或个人的Java应用而言Q只要你的应用程序需要移植或多OS发布Q那么将现有应用从一个系l移植到另一个操作系l将是g非常L的事情,因ؓ(f)Java使用了虚拟机机制Q可以脱OS的约束而独立解释ƈ执行class?br />
   但有利也有弊Q对于很多程序而言Q这也同时意味着你的用户必须获得JRE支持Q也是说他需要安装JVM。但我国的现实情况却是很多h别说让他自己下蝲安装JREQ你是l他做好全[下一步]的安装程序,他恐怕也q?#8220;下一?#8221;都搞不定……||||

   有鉴于此Q我试提供一U解x案,我将它命名ؓ(f)QGreenJVMQ也是l色的JVM?br />
   GreenJVM是一个专为绿化Java应用而存在的程?以C++开发(昨晚上抽I写的小应用E序Q代码原型以前在Blog发过Q?a >通过exe启动class Q。它的执行文件体U很仅?70KB,本n也是一个基于JNI的Java应用.真正的核心文件只??一是GreenJVM.exe(执行文g),一个vm.cfg(配置文g),如下?
          
         

    它的功能非常?仅是解压自带的JREq取代java.exe文g直接调度jvm.dll|了。但是q样一个小E序Q却可以很轻杄实现Java软g的绿色发布?br />          
   以千里冰兄的YOYOPlayerZ(冰封兄blog:http://m.tkk7.com/hadeslee/)Q我们都知道q是一个非怹好的Java音乐播放?在Java圈内已经有名气。但遗憾的是,Ҏ(gu)千千静听q类知名软g而言,了解它的人简直比华南虎还要稀?.....虽然软g普及(qing)率低的原因多U多?但对Java应用而言,I其Ҏ(gu)q是JVM安装的关pR就?#8220;妈是女h”的道理一PJavaE序的运行环境必L与其开发版本兼容的JRE存在Q否则无法运作。也是q道门槛,不知把多普通用h在了Java应用之外?br />
   可能你会(x)说这些是事Q的,Ҏ(gu)们这些JavaE序员来讲当然不存在M问题Q但令h遗憾的是Q对l大多数普通用P特别是ƈ不成熟的中国C|民而言Q我是指软g知识的^均?#8230;…其实牛h也很?#8230;…Q,安装JREq几乎是件不可想象的艰巨d;除非他们有必M用不可的理由Q否则需要下载第三方软g的程序,l对是第一旉被pass掉的Q一般h使用软g的准则就一条:(x)单就用,ȝ(ch)׃用)Q无形中大大增加了Java软g普及(qing)的难度,明明是很好的E序Q却只能在Java圈子里流传,不禁令hD?br />
   事实上,我们可以通过极简单的技术手D|H破q一限制Q轻而易丑ְJava应用做成l色软gQ免除用戯些不必要犹UQo(h)他们攑ֿ大胆的用JavaE序?br />
   q个q程仅仅需要三步:(x)

   1、压~你的JREQ?br />
      
          
         目前GreenJVM支持rar和zip两种方式的解压?br />
   2、设|vm.cfgQ?br />          
      vm.cfg内容配置如下:               
  1. [LOON]
  2. /*虚拟压方?0.1版仅提供RAR?qing)ZIP两种,Windowsq_下徏议用RAR(调用自带unrar.dll,故不要求本地
  3. 存在WinRAR,使用ZIP则可以删除unrar.dll)*/
  4. SET_UNPACK_METHOD=rar
  5. //虚拟机压~包名称,要求配置在vm.cfg同\径下
  6. SET_VM_NAME=jre.pack
  7. //(g)本地jvm版本,低于期望值时使用自带jvm,否则以本地虚拟机优先q行
  8. SET_START_REQUIRE_VERSION=1.6
  9. //期望加蝲的jar,多包?;'分隔
  10. SET_START_JAR_PATH=fps_test.jar
  11. //期望执行的mainc?/span>
  12. SET_START_MAIN_CLASS=org/test/BallPanel
  13. //选填,试从指定环境变量获取jvm路径,存在则优先运行本地jvm
  14. //SET_START_ENV=JAVA_HOME
   3、发布应用,此时只需一个文件夹Q就可以完全容纳下整个Java应用了?br />
   现在我们来看看一个基本完整JRE1.6压羃?L了bin下的exe文g)与YOYOPlayer攑֜一起后的空间占用情况,如下图:(x)
       
    
   

       Ҏ(gu)百来MB的JRE而言Q现在M不过20MB的体U已l是的太多。只需直接丢给用户q个文g夹,告诉用户一?#8220;双击EXE文g执行”Q就能如常运行此E序Q而不必再解释或说明什么?nbsp;          

          但饶是如此,20MB的音乐播攑֙Q相?MB左右的千千静听而言q是太大了,对很多普通用h说依旧难以接受,他们不会(x)去考虑JavaҎ(gu),只会(x)L“千千2MBp搞定的事Q你怎么p?0MB才行Q肯定是水^不行Q不?#8230;…”QJavaE序员们集体抱头哭~~~。ؓ(f)了避免这cL늚发生Q这时就需要我们在jre的体U上做些文章了?br />          
          和人的大脑zd区域一P相对于我们每个应用而言QJRE中也臛_?x)?0MB以上Q只多不)是被费掉的ln不用区域,而这些区域中的组件及(qing)cd的唯一作用是贪婪的占用硬盘空间Ş了~因此扑ևq些区域q羃减它Q就能最大限度的减小E序体积。(虽然sun或其它jvm提供商大多都反对q样Q但我们只是在实验Ş?)Q况且我认ؓ(f)他们早晚也会(x)开放jvm定制服务的?Q?br />           
          以YOYOPlayerZQ实际上我们只需在JRE中保留其音频支持、AWT/SWing支持、及(qing)|络支持{部分就好,其余的部分大可删掉不要?br />
          下例我做了一个精的JRE压羃包,如下?

            
          只用了不?MB的空?便以完成YOYOPlayer的全部功?
      
          我们把这个JRE和YOYOPlayer攑֜一?全部加v来也不过9MB多一?而YOYOPlayer依旧可以在无JREpȝ中正常运?效果如下?
         
          
        
          当然,如果再l删的话Q占用空间肯定还?x)有一定的下降q度Q我认ؓ(f)臛_能将JRE压羃?MB以内;但现实意义不大,毕竟不是做嵌入式开发,Z1Q?MB贚w么大劲不值当?#8230;…。事实上Q对于绝大多数Java应用而言Q压~后臛_9MB左右的空间占用便lԒ有余?况且q有q一步精的余地?br />          
          如下?q是我以前在Blog发过的一个FPS速程?效果如下:
          
         
        
          现在我用一个针对AWT使用而精的JRE,在另一台无Java环境的电(sh)脑上试,l果如下?

          

          可以看到,E序正常q行,而且FPS数有明显提高,q没有因为直接调用JVM而削׃性能.
                    
          q个完全支持AWTlg的JRE和执行程序全打成一个rar文g也不q?MB左右QPS:׃最占空间的JRE已经压羃q,所以再压羃其实意义不大……Q?实际上与本地E序的大已l相差无几了.

          不过q?MB的JRE也不能说很小?如果愿意深度_的话Q?MB的JREq行敝h的loonframework-gameQ尚未发布)都已lԒl有余。就q行库而言Q对比rmxpQruby语言的游戏开发玩?#8230;…Q还要小的多?br />  
          q些几MB的Java应用,攑ֈU盘里随n携带lԒ有余Q要用时在U盘里便可以直接运?当然Q由于api依赖的关p,除非我ؓ(f)其它q_重新制作启动文g,否则只支持提供win32 api的系l?Q不用了q接删文gQ环保安全无污染Q标准的l色食品Q不C看看啊~  

          再稍微正规点做个安装文gQ绿色Y件不能等同于无需安装的YӞ毕竟安装只不q是个部|过E,和绿不绿色没有实质上关系。愚以ؓ(f)Q只要不改变现有pȝ配置Q不依赖本地pȝlg的Y仉可称为绿色YӞ相反q不用安装Q一执行注册到pȝ中一堆ؕ七八p东西的软g同样不能说是l色的。)Q那么程序的体积q将q一步减?br />
          以YOYOPlayerZ,最l提供给用户一?MB甚至4MB左右的绿色应用是l对可以做到?Ҏ(gu)5.2.1版占?.85MBI间的千千静听来?已经看不Z者间有太大区?普通的音乐爱好者已l没有理׃下蝲看看?
        
          而一旦他们用?׃(x)慢慢发现Java应用的精妙之?他会(x)发现无论以后他用什么系l?q套软g他都无法自拔的使用下去.

       
  
目地址Qhttp://code.google.com/p/greenvm/

———————————————————————————————————————————?br />
0.1.1版发布:(x)

 
 
目地址Qhttp://code.google.com/p/greenvm/

  新增[SET_LOCAL_JRE_UPDATE],通过此项可以命o(h)本地JRE自动更新?br />
  一起发布的是一个Java仉K甉|戏(源码见包内)Q共讄有三关三个小BOSS。采用有GreenJVM发布Q因此可以运行在未装载JRE的Windowspȝ之上?(N久以前写的一个古?#8230;…凑活看吧……)?br />
  准备写到1.0时再去Sourceforge甌目……现在Loonframeworkq没弄完?#8230;…


0.1.1.3版发布:(x)

 
目地址Qhttp://code.google.com/p/greenvm/

   新增7z格式压羃包解压支持,使用此格式进行虚拟机压羃?

_____________________________________________________________________________________________________________
_____________________________________________________________________________________________________________


GreenDotNet0.1.0

GreenDotNet是一个根据GreenJVMUL的应?目标是实?netframework虚拟机的l色发布?br />
GreenDotNet 0.1.1 要说?br />
1、本E序是一个非常简单的.NetE序免安装发布工P可以满l大部分.Net framework2.0?qing)以下环境开发之桌面应用的绿色发布及(qing)使用?br />
2、本E序目前阶段不尝试虚?Netq行环境Q一是难写,二是敝h极懒Q三我是JavaE序员,明白Q^^……Q,虚拟机初始化后将直接通过GreenDotNet.exe在Windows中布|最.Net环境Q故对程序运行效率无影响?br />
3、虚拟机压羃包中仅删除了System.WebQ如果要用编码之cȝ功能自己实现好Q不然这堆东西也5MB左右呢|||Q,保留了其余一切链接库(如操作数据库必须的System.Data{,不要p己删吧~)Q因此绝大多数操作皆可在此环境下正常使用?br />
4、由于采用了真实的Windows环境q行布vQ因此加密或h后的.NetE序依旧可以正常在此环境下运行?br />
5、相较用Salamander .NET Linker{收费工P含用飞信运行框Ӟ而言Q这只是一个简写的.Net布v方式Q故而绝对不?x)存在版权或收费{问题?br />

相关文g说明Q?br />
GreenDotNet.exe : 启动文gQ它?yu)v到本地环境探针及(qing)布v.Net环境的作用?br />
vm.cfg : 配置文gQ决定GreenDotNet.exe对系l进行的相关操作?br />
dotnet.packQ?MBQ?: 虚拟机压~包Q?z格式产生Q目前仅提供.Net 2.0版本支持Q不保证2.0以下或以上版本开发之应用在此环境能够正常q行?


vm.cfg配置如下:
  1. [LOON]
  2. //虚拟压方?目前提供RAR、ZIP?Z三种压羃方式的解压支?/span>
  3. SET_UNPACK_METHOD=7z
  4. //虚拟机压~包名称,要求配置在vm.cfg同\径下
  5. SET_VM_NAME=DotNet.pack
  6. //(g)本?net版本,低于期望值时使用自带.net,否则以本地虚拟机优先q行
  7. SET_START_REQUIRE_VERSION=1.1
  8. //期望执行的exe文g,要求与vm.cfg同\径下
  9. SET_START_MAIN_EXE=ComicStars.exe



目地址Qhttp://code.google.com/p/greenvm/


CZE序:


 Zero漫天星辰漫画下蝲器是一?Net的在UOL索及(qing)下蝲工具Q采?netframework1.1开?使用.netUa(b)是由于拖控g方便|||),作ؓ(f)GreenDotNet的示例程序一起发?




smildlzj 2008-12-21 22:39 发表评论
]]>
C#.Net: 实现支持断点l传多线E下载的 Http Web 客户端工L(fng)http://m.tkk7.com/smildlzj/articles/247435.htmlsmildlzjsmildlzjSat, 20 Dec 2008 01:34:00 GMThttp://m.tkk7.com/smildlzj/articles/247435.htmlhttp://m.tkk7.com/smildlzj/comments/247435.htmlhttp://m.tkk7.com/smildlzj/articles/247435.html#Feedback0http://m.tkk7.com/smildlzj/comments/commentRss/247435.htmlhttp://m.tkk7.com/smildlzj/services/trackbacks/247435.html阅读全文

smildlzj 2008-12-20 09:34 发表评论
]]>
Microsoft .Net Remotingpd专题之二QMarshal、Disconnect与生命周期以?qing)跟t服?/title><link>http://m.tkk7.com/smildlzj/articles/246885.html</link><dc:creator>smildlzj</dc:creator><author>smildlzj</author><pubDate>Wed, 17 Dec 2008 07:34:00 GMT</pubDate><guid>http://m.tkk7.com/smildlzj/articles/246885.html</guid><wfw:comment>http://m.tkk7.com/smildlzj/comments/246885.html</wfw:comment><comments>http://m.tkk7.com/smildlzj/articles/246885.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/smildlzj/comments/commentRss/246885.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/smildlzj/services/trackbacks/246885.html</trackback:ping><description><![CDATA[<p>From:http://www.cnblogs.com/wayfarer/archive/2004/08/05/30437.html<br /> <a id="viewpost1_TitleUrl" ><font color="#000080"><br /> Microsoft .Net Remotingpd专题之一:.Net Remoting基础?/font></a><a id="viewpost1_TitleUrl" ></a></p> <p><a id="viewpost1_TitleUrl" ><font color="#000080">Microsoft .Net Remotingpd专题之三QRemoting事g处理全接?/font></a></p> <p><font color="#a52a2a"><strong><font color="#000000">Microsoft .Net Remotingpd专题之二</font></strong> </font></p> <p><font color="#a52a2a"><strong>一、远E对象的Ȁz?/strong></font></p> <p>在Remoting中有三种ȀzL式,一般的实现是通过RemotingServicescȝ静态方法来完成。工作过E事实上是将该远E对象注册到通道中。由于Remoting没有提供与之对应的UnregisterҎ(gu)来注销q程对象Q所以如果需要注?注销指定对象Q微软推荐用MarshalQ一般译为编l)和Disconnect配对使用。在?a rel="bookmark" mce_>Net Remoting基础?/a>》中我已l谈刎ͼ(x)Marshal()Ҏ(gu)是将MarshalByRefObjectcd象{化ؓ(f)ObjRefcd象,q个对象是存储生成代理以与远E对象通讯所需的所有相关信息。这样就可以该实例序列化以便在应用E序域之间以?qing)通过|络q行传输Q客L(fng)可以调用了。而Disconnect()Ҏ(gu)则将具体的实例对象从通道中断开?/p> <p>Ҏ(gu)上述说明QMarshal()Ҏ(gu)对远E对象以引用方式q行~组QMarshal-by-ReferenceQMBRQ,q将对象的代理信息放到通道中。客L(fng)可以通过Activator.GetObject()来获取。如果用戯注销该对象,则通过调用Disconnect()Ҏ(gu)。那么这U方式对于编l的q程对象是否存在生命周期的管理呢Q这是本文所要描q的问题?/p> <p><font color="#a52a2a"><strong>二、生命周?/strong></font></p> <p>在CLR中,框架提供了GCQ垃圑֛收器Q来理内存中对象的生命周期。同L(fng)Q?Net Remoting使用了一U分布式垃圾回收Q基于租用的形式来管理远E对象的生命周期?/p> <p>早期的DCOM对于对象生命周期的管理是通过ping和引用计数来定对象何时应当作ؓ(f)垃圾回收。然而ping引v的网l流量对分布式应用程序的性能是一U痛苦的负担Q它大大地媄(jing)响了分布式处理的整体性能?Net Remoting在每个应用程序域中都引入一个租用管理器Qؓ(f)每个服务器端的SingleTonQ或每个客户端激zȝq程对象保存着对租用对象的引用。(说明Q对于服务器端激zȝSingleCall方式Q由于它是无状态的Q对于每个激zȝq程对象Q都由CLR的GC来自动回Ӟ因此对于SingleCall模式Ȁzȝq程对象Q不存在生命周期的管理。)</p> <p><font color="#a52a2a">1、租?/font></p> <p>U用是个装了TimeSpan值的对象Q用以管理远E对象的生存期。在.Net Remoting中提供了定义U用功能的ILease接口。当Remoting通过SingleTon模式或客L(fng)ȀzL式来Ȁz远E对象时Q租用对象调用从System.MarshalByRefObjectl承的InitializeLifetimeServiceҎ(gu)Q向对象hU用?/p> <p>ILease接口定义了有关生命周期的属性,均ؓ(f)TimeSpan倹{如下:(x)<br /> InitialLeaseTimeQ初始化有效旉Q默认gؓ(f)300U,如果?Q表C永不过期;<br /> RenewOnCallTimeQ调用远E对象一个方法时的租用更新时_(d)默认gؓ(f)120U;<br /> SponsorshipTimeoutQ超时|通知SponsorQ发起hQ租用过期后QRemoting?x)等待的旉Q默认gؓ(f)120U;<br /> CurrentLeaseTimeQ当前租用时_(d)首次获得U用Ӟ为InitializeLeaseTime的倹{?/p> <p>Remoting的远E对象因为承了MarshalByRefObjectQ因此默认承了InitializeLifetimeServiceҎ(gu)Q那么租用的相关属性ؓ(f)默认倹{如果要改变q些讄Q可以在q程对象中重写该Ҏ(gu)。例如:(x)<br />  public override object InitializeLifetimeService()<br />  {<br />   ILease lease = (ILease)base.InitializeLifetimeService();<br />   if (lease.CurrentState == LeaseState.Initial)<br />   {<br />    lease.InitialLeaseTime = TimeSpan.FromMinutes(1);<br />    lease.RenewOnCallTime = TimeSpan.FromSeconds(20);<br />   }<br />   return lease;  <br />  }</p> <p>也可以忽略该Ҏ(gu)Q将对象的租用周期改变ؓ(f)无限Q?br />  public override object InitializeLifetimeService()<br />  {<br />   return null;<br />  }</p> <p><font color="#a52a2a">2、租用管理器</font></p> <p>如果是前面所说的U用主要是应用在每个具体的远E对象上Q那么租用管理器是服务器端专门用来管理远E对象生命周期的理器,它维持着一个System.Hashtable成员Q将U用映射为System.DateTime实例表示每个U用何时应过期。Remoting采用轮询的方式以一定的旉唤醒U用理器,(g)查每个租用是否过期。默认ؓ(f)?0U钟唤醒一ơ。轮询的间隔可以配置Q如轮询间隔设|ؓ(f)5分钟QLifetimeService.LeaseManagerPollTime = System.TimeSpan.FromMinutes(5);</p> <p>我们q可以在U用理器中讄q程对象U用的属性,如改变远E对象的初始有效旉为永久有效:(x)<br /> LifetimeServices.LeaseTime = TimeSpan.Zero;</p> <p>我们也可以通过配置文g来设|生命周期,如:(x)<br /> &lt;configuration&gt;<br />  &lt;system.runtime.remoting&gt;<br />   &lt;application name = "SimpleServer"&gt;<br />    &lt;lifetime leaseTime = "0" sponsorshipTimeOut = "1M" renewOnCallTime = "1M" pollTime = "30S"/&gt;       <br />   &lt;/application&gt;<br />  &lt;/system.runtime.remoting&gt;<br /> &lt;/configuration&gt;</p> <p>注:(x)配置文g中的pollTime即ؓ(f)上面所说的U用理器的轮询间隔旉LeaseManagerPollTime?/p> <p>U用理器对于生命周期的讄是针Ҏ(gu)务器上所有的q程对象。当我们通过配置文g或租用管理器讄U用的属性时Q所有远E对象的生命周期都遵循该讄Q除非我们对于指定的q程对象通过重写InitializeLifetimeServiceҎ(gu)Q改变了相关配置。也是_(d)q程对象的租用配|优先高于服务器端配置?/p> <p><font color="#a52a2a">3、发起hQSponsorQ?/font></p> <p>发v人是针对客户端而言的。远E对象就是发起h要租用的对象Q发起h可以与服务器端签订租U,U定U用旉。一旦到期后Q发起hq可以箋U,像现实生活中租方的契约Q房东、租房者之间的关系一栗?/p> <p>?Net Framework中的System.Runtime.Remoting.Lifetime命名I间中定义了ClientSponsorc,该类l承了System.MarshalByRefObjectQƈ实现了ISponsor接口。ClientSponsorcȝ属性和Ҏ(gu)Q可以参考MSDN?/p> <p>客户端要使用发v人机Ӟ必须创徏ClientSponsorcȝ一个实例。然后调用相x法如Register()或Renewal()Ҏ(gu)来注册远E对象或廉生命周期。如Q?br /> RemotingObject obj = new RemotingObject();<br /> ClientSponsor sponsor = new ClientSponsor();<br /> sponsor.RenewalTime = TimeSpan.FromMinutes(2);<br /> sponsor.Register(obj);</p> <p>l租旉也可以在ClientSponsor的构造函C直接讄Q如Q?br /> ClientSponsor sponsor = new ClientSponsor(TimeSpan.FromMinutes(2));<br /> sponsor.Register(obj);</p> <p>我们也可以自q写Sponsor来管理发起h机制Q这个类必须l承ClientSponsorq实现ISponsor接口?/p> <p><font color="#a52a2a"><strong>三、跟t服?/strong></font></p> <p>如前所qͼ我们要判断通过Marshal~组q程对象是否存在生命周期的管理。在Remoting中,可以通过跟踪服务E序来监视MBR对象的编l进E?/p> <p>我们可以创徏一个简单的跟踪处理E序Q该E序实现接口ITrackingHandler。接口ITrackingHandler定义?个方法,MarshalObject、UnmarshalObject和DisconnectedObject。当q程对象被编l、解l和断开q接Ӟ׃(x)调用相应的方法。下面是该跟t处理类的代码:(x)public class MyTracking:ITrackingHandler<br /> {<br />  public MyTracking()<br />  {<br />   //<br />   // TODO: 在此处添加构造函数逻辑<br />   //<br />  }</p> <p> public void MarshaledObject(object obj,ObjRef or)<br />  {<br />   Console.WriteLine();<br />   Console.WriteLine("对象" + obj.Tostring() + " is marshaled at " + DateTime.Now.ToShortTimeString());<br />  }</p> <p> public void UnmarshaledObject(object obj,ObjRef or)<br />  {<br />   Console.WriteLine();<br />   Console.WriteLine("对象" + obj.Tostring() + " is unmarshaled at " + DateTime.Now.ToShortTimeString());<br />  }</p> <p>  public void DisconnectedObject(object obj)<br />  {<br />   Console.WriteLine(obj.ToString() + " is disconnected at " + DateTime.Now.ToShortTimeString());<br />  }<br /> }</p> <p>然后再服务器端创跟踪处理cȝ实例Qƈ注册跟踪服务Q?br /> TrackingServices.RegisterTrackingHandler(new MyTracking());</p> <p><font color="#a52a2a"><strong>四、测?/strong></font></p> <p><font color="#a52a2a">1、徏立两个远E对象,q写InitializeLifetimeServiceҎ(gu)Q?/font></p> <p>对象一QAppService1<br /> 初始生命周期Q?分钟</p> <p> public class AppService1:MarshalByRefObject<br />  {<br />   public void PrintString(string contents)<br />   {<br />    Console.WriteLine(contents);   <br />   }</p> <p>  public override object InitializeLifetimeService()<br />   {<br />    ILease lease = (ILease)base.InitializeLifetimeService();<br />    if (lease.CurrentState == LeaseState.Initial)<br />    {<br />     lease.InitialLeaseTime = TimeSpan.FromMinutes(1);<br />     lease.RenewOnCallTime = TimeSpan.FromSeconds(20);<br />    }<br />    return lease;<br />    <br />   }<br />  }</p> <p>对象二:(x)AppService2<br /> 初始生命周期Q?分钟</p> <p> public class AppService2:MarshalByRefObject<br />  {<br />   public void PrintString(string contents)<br />   {<br />    Console.WriteLine(contents);   <br />   }</p> <p>  public override object InitializeLifetimeService()<br />   {<br />    ILease lease = (ILease)base.InitializeLifetimeService();<br />    if (lease.CurrentState == LeaseState.Initial)<br />    {<br />     lease.InitialLeaseTime = TimeSpan.FromMinutes(3);<br />     lease.RenewOnCallTime = TimeSpan.FromSeconds(40);<br />    }<br />    return lease;<br />    <br />   }<br />  }</p> <p>为简便v见,两个对象的方法都一栗?/p> <p><font color="#a52a2a">2、服务器?/font></p> <p>(1) 首先建立如上的监控处理类Q?/p> <p>(2) 注册通道Q?br /> TcpChannel channel = new TcpChannel(8080);<br /> ChannelServices.RegisterChannel(channel);</p> <p>(3) 讄U用理器的初始U用旉为无限:(x)<br /> LifetimeServices.LeaseTime = TimeSpan.Zero;</p> <p>(4) 创徏该跟t处理类的实例,q注册跟t服务:(x)<br /> TrackingServices.RegisterTrackingHandler(new MyTracking());</p> <p>(5) ~组两个q程对象Q?br /> ServerAS.AppService1 service1 = new ServerAS1.AppService1();<br /> ObjRef objRef1 = RemotingServices.Marshal((MarshalByRefObject)service1,"AppService1");</p> <p>ServerAS.AppService2 service2 = new ServerAS1.AppService2();<br /> ObjRef objRef2 = RemotingServices.Marshal((MarshalByRefObject)service2,"AppService2");</p> <p>(6) 使服务器端保持运行:(x)<br /> Console.WriteLine("Remoting服务启动Q按退?.."); <br /> Console.ReadLine();</p> <p><font color="#a52a2a">3、客L(fng)</font></p> <p>通过Activator.GetObject()获得两个q程对象Qƈ调用其方法PrintString。代码略?/p> <p><font color="#a52a2a">4、运行测?/font>Q?/p> <p>q行服务器端和客L(fng)Q由于监控程序将监视q程对象的编l进E,因此在运行开始,׃(x)昄q程对象已经被MarshalQ?/p> <p align="center"><img height="271" src="http://images.cnblogs.com/cnblogs_com/wayfarer/ar1.gif" width="668" border="0" mce_src="http://images.cnblogs.com/cnblogs_com/wayfarer/ar1.gif" alt="" /></p> <p>然后再客L(fng)调用q两个远E对象的PrintStringҎ(gu)Q服务器端接受字W串Q?/p> <p align="center"><img height="303" src="http://images.cnblogs.com/cnblogs_com/wayfarer/ar2.gif" width="668" border="0" mce_src="http://images.cnblogs.com/cnblogs_com/wayfarer/ar2.gif" alt="" /></p> <p>一分钟后,q程对象一自动被DisconnectQ?/p> <p align="center"><img height="303" src="http://images.cnblogs.com/cnblogs_com/wayfarer/ar3.gif" width="668" border="0" mce_src="http://images.cnblogs.com/cnblogs_com/wayfarer/ar3.gif" alt="" /></p> <p>此时客户端如要调用远E对象一Q会(x)抛出RemotingException异常Q?/p> <p>又一分钟后,q程对象二被Disconnect了:(x)</p> <p>align="center"><img height="303" src="http://images.cnblogs.com/cnblogs_com/wayfarer/ar4.gif" width="668" border="0" mce_src="http://images.cnblogs.com/cnblogs_com/wayfarer/ar4.gif" alt="" /></p> <p>用户q可以根据这个代码测试RenewOnCallTime的时间是否正。也x_(d)在对象还未被DisconnectӞ调用对象Q则从调用对象的q一刻vQ其生命周期不再是原来设定的初始有效旉|InitialLeaseTimeQ,而是U用更新旉|RenewOnCallTimeQ。另外,如果q两个远E对象没有重写InitializeLifetimeServiceҎ(gu)Q则生命周期应ؓ(f)U用理器所讑֮的|为永久有效(讄?Q。那么这两个对象不会(x)被自动DisconnectQ除非我们显式指定关闭它的连接。当?dng)如果我们昑ּ关闭q接Q跟t程序仍然会(x)监视到它的变化,然后昄出来?br /> </p> <p><font color="#a52a2a"><strong>五、结?/strong><br /> </font></p> <p>通过我们的测试,其实l论已经很明显了。通过Marshal~组的对象要受到U用的生命周期所控制。注意对象被DisconnectQƈ不是指这个对象被GC回收Q而是指这个对象保存在通道的相关代理信息被断开了,而对象本w仍然在服务器端存在?br /> </p> <p>所以我们通过Remoting提供服务Q应Ҏ(gu)实际情况指定q程对象的生命周期,如果不指定,则ؓ(f)Remoting默认的设定。要让所有的q程对象怹有效Q可以通过配置文g或租用管理器初始有效时间设??/p> <img src ="http://m.tkk7.com/smildlzj/aggbug/246885.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/smildlzj/" target="_blank">smildlzj</a> 2008-12-17 15:34 <a href="http://m.tkk7.com/smildlzj/articles/246885.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 使用飞信VMDotNet使C#E序q.NET FRAMEWORK也能q行的一些心??http://m.tkk7.com/smildlzj/articles/245614.htmlsmildlzjsmildlzjThu, 11 Dec 2008 01:42:00 GMThttp://m.tkk7.com/smildlzj/articles/245614.htmlhttp://m.tkk7.com/smildlzj/comments/245614.htmlhttp://m.tkk7.com/smildlzj/articles/245614.html#Feedback0http://m.tkk7.com/smildlzj/comments/commentRss/245614.htmlhttp://m.tkk7.com/smildlzj/services/trackbacks/245614.html
之前看到有用别的Ҏ(gu)来实现的Q但我还是选择了现在比较流行的软g飞信中带的VMDotNetQ也是所谓的.NET FRAMEWORK虚拟机吧。相信有很多Z已经看过相关文章了,但是对于新手我还是再提一下,在你的飞信的安装目录下有一个VMDotNet文g夹,q?个就是我们要用的最主要的内容了Q先把它COPY出来吧!

        下面先来单说明一下VMDotNet文g夹吧Q在q个文g夹之下有一个v2.0.50727文g夹,很明显是.NET FRAMEWORK的版本号啦,q入q个文g夹,里面有一个FetionVM.exe的可执行文gQ飞信的图标Q,q个便是我们要用到的虚拟机文件了。其 它文件我们不用考虑。这个程序可以带入一个参敎ͼ卌在此虚拟环境下运行的E序的\径。Ş如FetionVM.exe C:\1.exeQ也可以使用相对路径QFetionVM.exe 1.exeQ当然这栯求两者在同一目录下啦。这里顺便要再说一下VMDotNet.logq个文gQ这里记录了在调用FetionVM.exe时的错误 信息Q主要是路径不对Q找不到对应的程序。在了解了这个文件夹之后Q我们可以动手开始做啦!

        把这个文件夹复制C的项目的DEBUG目录下,我的已有目名ؓ(f)PicProcessorQ生成的可执行文件ؓ(f)Q当然你也可以视情况而定了,如果攑ֈ的地方就应该注意一下\径就好了?/p>

        在这里我们需要再新徏一个C#应用E序目Q我把它命名为PicStartQ把FORM1.CS删除Q或者直接新Z个控制台E序Q在Program.cs中写入以下代码:(x)

using System; using System.Collections.Generic; using System.Windows.Forms;

namespace PicStart {     static class Program     {         /// <summary>         /// 应用E序的主入口炏V?        /// </summary>         [STAThread]         static void Main()         {             //下面是调用外部程序的代码             System.Diagnostics.ProcessStartInfo Info = new System.Diagnostics.ProcessStartInfo();             Info.FileName = "VMDotNet\\v2.0.50727\\FetionVM.exe"; //q里是你要调用到的外部程?            Info.Arguments = "PicProcessor.exe"; //调用外部E序的参敎ͼq里是图片处理项目的可执行文Ӟ注意不是现在q个目的可执行文g             System.Diagnostics.Process Proc;

            try             {                 //                 //启动外部E序                 //                 Proc = System.Diagnostics.Process.Start(Info);             }             catch (System.ComponentModel.Win32Exception e)             {                 Console.WriteLine("pȝ找不到指定的E序文g。\r{0}", e);                 return;             }         }     } }

        在做完了q个目以后我们生成此项目,q个时候我们就可以开始制作程序的安装文g了?/p>

         以前我们利用VS2005做安装包的时候可以选择?NET FRAMEWORK集成q去Q但现在我们不用了,请大家把相应的选项全部LQ还不会(x)使用VS2005安装和部|功能的朋友请到此网址ȝ一下?a >http://www.vs2005.com/Setup/205/1/default.aspx

         我们把PicProcessor和PicStart目都添加进新徏的安装和部v目Setup中来Q把E序启动的快h式全部设?PicStart.exe可以了Q具体的操作Ҏ(gu)在上面的链接里有。然后开始生成安装包Q生成的安装包如果选择大小优先的话QVMDotNet?x)占用??0Mb左右的空_(d)然后加上你程序的大小是q个安装文g的大了Q比以前20多MB?Net Framework多了,而且安装速度也要快的多,q样E序在没?Net Framework的机器上也能q行了,大家都试试吧Q有什么问题可以给我留a。每天晚上一般我都会(x)上线Q会(x)?qing)时l大家回复的Q?/p>

        W一ơ写原创技术文章,不之处Q请大家多多包涵Q谢谢!

 转脓(chung)?a >http://hi.baidu.com/ck436/blog/item/b91b5f8295b7e8a10cf4d256.html

 

此文件是|上转脓(chung)q来的,只是l自׃为参考,h砖引玉的作用Q没惛_也有朋友看了q文章,所以特在此处说明一下:(x)其实再用.Net作启动程序是不行的,应该用C++6.0的做一个启动程序,q样O(jin)K了,c(din)?8.07.13



smildlzj 2008-12-11 09:42 发表评论
]]>
使C#E序q.net框架q行(非飞信方? http://m.tkk7.com/smildlzj/articles/245611.htmlsmildlzjsmildlzjThu, 11 Dec 2008 01:21:00 GMThttp://m.tkk7.com/smildlzj/articles/245611.htmlhttp://m.tkk7.com/smildlzj/comments/245611.htmlhttp://m.tkk7.com/smildlzj/articles/245611.html#Feedback0http://m.tkk7.com/smildlzj/comments/commentRss/245611.htmlhttp://m.tkk7.com/smildlzj/services/trackbacks/245611.html

q几天看了很多关于脱L架运行C#E序的文章,千篇一律,都是讲飞信方案的Q此Ҏ(gu)涉及(qing)一些法律问题,只能自己研究一下,后来用google国|站搜了一把,看了些文章,无意中发现monoQ又用mono关键字到google中国搜了一把,已经有h实现控制台程序脱?net框架了?/p>

其实是换mono的公paq行时来使用。这样做的好处是体积,发布免安装。首先,(zhn)需要下载mono的最新版。http://ftp.novell.com/pub/mono/archive/1.9.1/windows-installer/2/mono-1.9.1-gtksharp-2.10.4-win32-2.exeQ安装后Q就可以l箋q行了?br />

1、用Visual Studio创徏一个Windows应用E序Q假讑֏做WinAppQƈd一个按钮?/p>

2、编译此目Q得C个WinApp.exe文g?br />

3、自己徏立一个文件夹WinAppQ其中再建立bin和libq两个文件夹

4、将mono安装文g夹中的bin和lib子文件夹中需要的文g拯臛_才徏立的那两个文件夹。mono的默认安装位|是QC:\Program Files\Mono-1.9.1

5、将需要运行的exe文g攑օWinApp文g夏V?br />

6、调用,可以使用bat批处理来调用Qbin\mono.exe WinApp.exe?其实写个VC++的小E序调用最好,可以我没学过VC++)

好了Q发个代码上来,有兴的朋友可以研究一下,7zip打包后仅3.26MBQ却实现了免安装微Y庞大的框架。此试目我在U净的虚拟机和本机均试q,但有个bugQmono对中文\径支持不好,如若有中文\径,则无法运行。我后来又试了用C:\Program Files\Mono-1.9.1\bin\mono.exe来执行,则没有中文\径问题。我觉得~少了哪个文Ӟ一个一个试着拯到WinApp文g夹中Q再用批处理来执行,q是错误。后来干脆将整个安装目录的文件全搬到WinApp目录中,执行批处理还是失败,可是用C:\Program Files\Mono-1.9.1\bin\mono.exe来执行就是能成功Q百思不得其解啊Q究竟少了什么东西呢Q?/p>

博客园单个文仉制在?.95MBQ我试了好多ơ不成功Q大家到我的CSDN上下载吧Q?分资源?br />

http://download.csdn.net/source/661248



smildlzj 2008-12-11 09:21 发表评论
]]>
C#使用BerkeleyDB操作?http://m.tkk7.com/smildlzj/articles/240253.htmlsmildlzjsmildlzjThu, 13 Nov 2008 02:37:00 GMThttp://m.tkk7.com/smildlzj/articles/240253.htmlhttp://m.tkk7.com/smildlzj/comments/240253.htmlhttp://m.tkk7.com/smildlzj/articles/240253.html#Feedback0http://m.tkk7.com/smildlzj/comments/commentRss/240253.htmlhttp://m.tkk7.com/smildlzj/services/trackbacks/240253.html阅读全文

smildlzj 2008-11-13 10:37 发表评论
]]>
Berkeley DB for .NET - Hello, World!http://m.tkk7.com/smildlzj/articles/240251.htmlsmildlzjsmildlzjThu, 13 Nov 2008 02:35:00 GMThttp://m.tkk7.com/smildlzj/articles/240251.htmlhttp://m.tkk7.com/smildlzj/comments/240251.htmlhttp://m.tkk7.com/smildlzj/articles/240251.html#Feedback0http://m.tkk7.com/smildlzj/comments/commentRss/240251.htmlhttp://m.tkk7.com/smildlzj/services/trackbacks/240251.htmlBerkeley DB 是个驰名已久的好东西Q在专用领域Q其性能|有敌手。作为其 .NET q_的封装版本,Berkeley DB for .NET 却让人感觉非帔RP且不说那cM C++ 风格的源码,单就其升U维护周期都让h很不攑ֿ。有点不理解Qؓ(f)什么作者不参?Berkeley DB for Java ~~~~ 不过q好Q?.95 版本的发布,让我们看C实用的可能。Berkeley DB for .NET 的源码和文档看得我头晕脑胀Q如果有什么差错,多多包涵……

有关 Berkeley DB 的基本概念,可参考以下文章?br />
嵌入式数据库pȝBerkeley DB (施聪)
Berkeley DB 概述 (皮东)

C/C++ 使用教程

风满?/a>

----------- 犯困的分隔线 ----------------------

先下载相关的E序包?br />
Berkeley DB 4.5.20
Berkeley DB for .NET 0.95

两个包中的 "libdb45.dll、libdb_dotNET45.dll、BerkeleyDb.Utils45.dll、Kds.Serialization.dll" {文件拷贝到你的目工程相关目录中,q将 Berkeley DB for .NET 的程序集(后三个文? d到工E引用中。OKQ还是老样子,先来个简单的 "Hello, World!" 试试?br />
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using BerkeleyDb;
using BerkeleyDb.Serialization;
using Kds.Serialization;
using Kds.Serialization.Buffer;

namespace ConsoleApplication1
{
  public class Program
  {
    static void Main(string[] args)
    {
      using (Db db = new Db(DbCreateFlags.None))
      {
        DbFile dbf = db.Open(null, @"test._db", null, DbType.BTree, Db.OpenFlags.Create, 0);

        DbEntry key = DbEntry.InOut(BitConverter.GetBytes(123));
        DbEntry data = DbEntry.InOut(Encoding.UTF8.GetBytes("Hello, World!"));

        Console.WriteLine(dbf.Put(null, ref key, ref data));
        dbf.Sync();

        ReadStatus status = dbf.Get(null, ref key, ref data, DbFile.ReadFlags.None);
        string s = Encoding.UTF8.GetString(data.Buffer, 0, data.Size);
        Console.WriteLine(s);
      }
    }
  }
}

输出Q?br /> Success
Hello, World!

smildlzj 2008-11-13 10:35 发表评论
]]>
两分钟用C#搭徏IE BHO勑֭, H取密码http://m.tkk7.com/smildlzj/articles/239814.htmlsmildlzjsmildlzjTue, 11 Nov 2008 02:50:00 GMThttp://m.tkk7.com/smildlzj/articles/239814.htmlhttp://m.tkk7.com/smildlzj/comments/239814.htmlhttp://m.tkk7.com/smildlzj/articles/239814.html#Feedback0http://m.tkk7.com/smildlzj/comments/commentRss/239814.htmlhttp://m.tkk7.com/smildlzj/services/trackbacks/239814.html微Y?997q正式退?span class="MsoNormal STYLE4" style="margin: 0in 0in 10pt">Browser Helper Object (BHO), 使程序员能够更好的对IEq行二次开发和操作. 在通过~写BHOE序数月? 我希望把我的一些经验告诉才开始的同志, 避免C些弯?

我本人是非常喜欢C++? 因ؓ(f)C++对内存直接操作的方式可以节省非常多的内存损? 也更快一? 但是在开发B(ti)HO的时? 我的也认识? C#明显要比C++强大很多. 例如C#提供的FOREACH 循环可以避免FOR循环产生的溢? 另外C#的类型{换也明显要强于C++. 毕竟BHO和C#都是微Y一? 理所当然, C#更适合BHO开发一? 我的W一个BHOE序是用C++写的. 对于COM的操?让我臛_弄了几天才搞清楚他们到底惛_什? 但是我的W一个C# BHOE序只用了几分钟搭建好了钩? 如果你希望从事BHO开? 而且你才开始学. 我想q片文章对(zhn)有点帮?

q篇文章本来是用英文写成? 因ؓ(f)工作环境的原? 中文已经来生? 如果有错误或者不太明昄地方. 请参考英文原?/p>

http://www.horizonideas.com/writings/article.php?id=11

下面竟让我们开?

首先我们需要在C#中新Z个DLL工程. 因ؓ(f)BHO是通过让IE调用DLL来驱动的. 我用的是V C# EXPRESS. 因ؓ(f)q已l完全够用了. V C# PROFESSIONAL q不需? 而且q很费内存.


 

当我们徏立一个空工程以后, 随便d一个文件夹叫BHO, 然后d一个文?

需要我们注意的? 我们q个文g必须被命名ؓ(f)IObjectWithSite.cs因ؓ(f)q样IE才知道这是一个BHOE序. 如果想知道更多关于IObjectWiteSite接口的内? h询MSDN http://msdn2.microsoft.com/en-us/library/Aa768220.aspx

在IObjectWithSite中必L两个Ҏ(gu)GetSite和SetSite. 我们主要是对后者进行调?通过名字大家可以猜C们是q什么的.

GetSite:  Gets the last site set with IObjectWithSite::SetSite. If there is no known site, the object returns a failure code.

SetSite:  Provides the site's IUnknown pointer to the object.

hVS STUIDO 默认的类名给L.因ؓ(f)IObjectWithSiteq不是一个类, 而是一个接?

 

不要忘记d System.Runtime.InteropServices

下面我们再添加剂一个叫BHO.CS的主文g.

q个新徏的类是基?IObjectWithSite接口? 正如同我前面讲的. 你就是通过q个接口来调用IE.

 

Z使用微Y的BHO?我们必须d下面两个? SHDocVw and MSHTML.他们一般都?Windows\System32 下面

SHDocVw is  Microsoft Shell Doc Object and Control Library

MSHTML is:   All interfaces for accessing the Dynamic HTML (DHTML) Object Model are based on IDispatch and are the basis of access to the object model that is also used by scripts. http://msdn2.microsoft.com/en-us/library/bb498651.aspx

光using SHDocVw" 是不够的, 你需要添?

Add SHDocVw 

因ؓ(f)E后我们需要用到MESSAGEBOX, 所以这里我也添加了一个WINDOWS FORM?

 

下面d两个变量: WebBrowser and HTMLDocument. 如同他们的名字. 一个是IE的变? 另外一个是IE所讉K的HTML变?

下面在这个类中田间一个叫 OnDocumentComplete 的函? 取其他名字也? 没什么太大关p? 但是q里ZCODE的可用?我们叫OnDocumentComplete. q个函数实际上是和CDHTMLDIALOG下面的OnDocumentComplete所对应?

CDHtmlDialog Class http://msdn2.microsoft.com/en-us/library/8bed8k60(VS.80).aspx .

OnDocumentComplete的触发是在一个HTML被LOAD完以? 你也可以避免用Navigate() or OnBeforeNavigate(). 他们表示在发问和讉K之前触发.

Please refer to http://msdn2.microsoft.com/en-us/library/8k5z3ekh(VS.80).aspx to find out what you need exactly.

?IObjectWithSite.cs?你需要支出IE的GUID, q样才方便注册表的更?

另外你需要给自己的程序添加一个GUID. q样IE才能在注册表中找C的信? 你可以用System.Guid.NewGuid() method 来得C个GUID. q比C++得到GUID的方法要Ҏ(gu)得多?

 

我们必须l?SetSite and GetSite 加上内容. 在SETSITE中我们就需要加入一个EVENTHANDLER, 让IE来触发我们的OnDocumentComplete函数.

Add one more reference

在BHO.CS下我们需要ؓ(f)我们的DLLdregister/unregister 函数.

~译, 我们有了我们的DLL.

下面通过DOS下的 regasm /codebase "BHO HelloWorld.dll" 命o(h)在注册dll. q里有一个问题了, Z?

因ؓ(f)我们忘了把我们的ȝ讄成PUBLIC, 所以别人都不能调用C的类. 自然注册不了.

 

然后成功了.

打开注册? 扑ֈBrowser Helper Object under LOCAL_MACHINE->SOFTWARE->MICROSOFT->WINDOWS->EXPLORER, 看看是不是有变化?

 

我们注册完了, 下面是来写我们的住E序来控制IE? 下面是一个例子来抓去你正讉K的页面上的所有INPUT 元素的NAME.

在DOCUMENT? 我们的所有元素都为IHTMLElement, 我们需要调用的是IHTMLInputElement. 所以我们通过GetElementByTagName的方法来查找所有的INPUT ELEMENT. 在找C后还需要进行类型{换才能找到对应的ATTRIBUTE. 否则IHTMLElement是不代有NAME ATTRIBUTE? IHTMLElement提供的ATTRIBUTE都是所有元素都有的. 例如ID, 例如TITLE, 例如OnClick{? 有的元素有自q有的ATTRIBUTE, 例如INPUT有OnFocusq就必须要{换成IHTMLInputElement才能上? INPUT对应的IHTMLInputElement, Select-> IHTMLSelectElement .......

There you go, see?

下面我们试另外一个方法叫 BeforeNavigate() .它的触发是在你开始下一个页面之? 也就是说例如你要提交一个表? 面要变化了, 他就被触?

实际上MS提供了两个类似的接口 BeforeNavigate and BeforeNavigate2(). 大家可以查MSDN看看有什么区? q里我们不多讲了.

 

同样我们d一个对应的函数原Ş(点图? 看大?.

dEVENTHANDLER

我们下面要干的是截获面上的密码.

See, how easily, you can get it.

通过上面的过E? 我希望?zhn)对BHO有一个初步的了解. 如果想知道更多内? 误问MSDN. 里面有非常详l的介绍. q里也引Z一个话? 我们可以看到, 几乎用不了两分钟我们可以截获你填写的Q何内? 你觉得IE是安全的? 即他可以通过SSL来对q出|卡的内容加? 但是在应用层一h如此的薄? 另外大家如果用IE都会(x)发觉泛滥成灾的ADD-ON, q就是因为BHO惹的?

大家如果不想按照我上面的?可以下我做好的模?直接攑ֈ你的Visual Studio 2005\Templates\ProjectTemplates文g夹下. 当开始一个新工程时? 点下那个BHO HELLOWORLD可以了. 所有上面的代码都给你做好了.

project template下蝲TEMPLATE

 



smildlzj 2008-11-11 10:50 发表评论
]]>
VS2005 多线E问?-H体中的U程安全调用http://m.tkk7.com/smildlzj/articles/237767.htmlsmildlzjsmildlzjFri, 31 Oct 2008 02:32:00 GMThttp://m.tkk7.com/smildlzj/articles/237767.htmlhttp://m.tkk7.com/smildlzj/comments/237767.htmlhttp://m.tkk7.com/smildlzj/articles/237767.html#Feedback0http://m.tkk7.com/smildlzj/comments/commentRss/237767.htmlhttp://m.tkk7.com/smildlzj/services/trackbacks/237767.html讉K Windows H体控g本质上不是线E安全的。如果有两个或多个线E操作某一控g的状态,则可能会(x)q该控件进入一U不一致的状态。还可能出现其他与线E相关的 bugQ包括争用情况和死锁。确保以U程安全方式讉K控g非常重要?/p>

.NET Framework 有助于在以非U程安全方式讉K控g时检到q一问题。在调试器中q行应用E序Ӟ如果创徏某控件的U程之外的其他线E试图调用该控gQ则调试器会(x)引发一?InvalidOperationExceptionQƈ提示消息Q?#8220;从不是创建控?control name 的线E访问它?#8221;

有三U方法可以从U程讉KWinH体的控Ӟ(x)非线E安全方式;U程安全调用Q用BackgroundWorkerq行的线E安全调用。其中,只有U程的安全调用可以宏观ƈ行处理。(另外两种方式都是在线E运行时接受命o(h)Q但在线E执行完以后才执行)?/p>

一Q对WindowsH体控g的非U程安全调用

该方式是从辅助线E直接调用。调用应用程序时Q调试器?x)引发一个InvalidOperationExceptionQ警告对控g的调用不是线E安全的?/p>

可以通过?CheckForIllegalCrossThreadCalls 属性的D|ؓ(f) false 来禁用此异常。这?x)控g以与?Visual Studio 2003 下相同的方式q行?/p>

具体做法如下Q?/p>

 

public Form1()
        
{
            InitializeComponent();
            Control.CheckForIllegalCrossThreadCalls 
= false;//q一行是关键 用于对线E的不安全调?/span>
        }

 

二:(x)对WindowsH体控g的线E安全调?/strong>

对窗体控件的U程安全调用需要用委托的方式?/p>

主要思\Q?/p>

1、查询控件的 InvokeRequired 属性?/p>

2、如?InvokeRequired q回 trueQ则使用实际调用控g的委托来调用 Invoke?/p>

3、如?InvokeRequired q回 falseQ则直接调用控g?/p>

例子Q在TextBox控g中输出相应的信息QSetText为textbox的内容设|方法,SetTextDelegate的委托类型封?SetTextҎ(gu)。TextBox控g的InvokeRequiredq回true是,SetTextҎ(gu)创徏SetTextDelegate的一个实 例,q调用窗体的InvokeҎ(gu)。是的SetTextҎ(gu)被创建TextBox控g的线E调用?/p>

 

   

  / /该委托在一个TextBox控g上设|text属性的异步调用功能为真
        
delegate void SetTextCallback(string text);

        
// 该线E用于对WindowsH体控g的安全调?/span>

        
private Thread demoThread = null;

 

 

// 该事件句柄创Z个对H体控gU程安全调用的线E?/span>

private void setTextSafeBtn_Click( object sender,  EventArgs e)
{
    
this.demoThread =
        
new Thread(new ThreadStart(this.ThreadProcSafe));

    
this.demoThread.Start();
}


// 该方法在WorkerU程中执行ƈ且发Z个线E安全的调用

private void ThreadProcSafe()
{
    
this.SetText("This text was set safely.");
}


//如果被调用的U程和创建的TextBox控g不同Q该Ҏ(gu)创Z个SetTextCallbackQ?br />
// q且用InvokeҎ(gu)异步调用自己?br /> // 如果相同Q则直接调用Ҏ(gu)讄Text的属性?/span>

private void SetText(string text)
{
    
// 获取的InvokeRequired调用的U程ID和创建的U程ID向比较?nbsp;
    
//如果两个U程ID不同Q则q回true 

      
if (this.textBox1.InvokeRequired)
     
{   
        SetTextCallback d 
= new SetTextCallback(SetText);
        
this.Invoke(d, new object[] { text });
    }

    
else
    
{
        
this.textBox1.Text = text;
    }

}

三、?BackgroundWorker q行的线E安全调?/strong>
在应用程序中实现多线E的首选方式是 使用 BackgroundWorker lg。BackgroundWorker lg使用事g驱动模型实现多线E。辅助线E运?DoWork 事g处理E序Q创建控件的U程q行 ProgressChanged ?RunWorkerCompleted 事g处理E序。注意不要从 DoWork 事g处理E序调用(zhn)的M控g?/p>

下面的代码示例不异步执行M工作Q因此没?DoWork 事g处理E序的实现。TextBox 控g?Text 属性在 RunWorkerCompleted 事g处理E序中直接设|?/p>

private void setTextBackgroundWorkerBtn_Click(object sender,  EventArgs e)
{
    
this.backgroundWorker1.RunWorkerAsync();
}


private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    
this.textBox1.Text =
        
"This text was set safely by BackgroundWorker.";
}






smildlzj 2008-10-31 10:32 发表评论
]]>
C#U程调用带参数的Ҏ(gu)http://m.tkk7.com/smildlzj/articles/237762.htmlsmildlzjsmildlzjFri, 31 Oct 2008 02:17:00 GMThttp://m.tkk7.com/smildlzj/articles/237762.htmlhttp://m.tkk7.com/smildlzj/comments/237762.htmlhttp://m.tkk7.com/smildlzj/articles/237762.html#Feedback0http://m.tkk7.com/smildlzj/comments/commentRss/237762.htmlhttp://m.tkk7.com/smildlzj/services/trackbacks/237762.htmlҎ(gu)一Q?/font>

一般来_(d)直接在子U程中对H体上的控g操作是会(x)出现异常Q这是由于子U程和运行窗体的U程是不同的I间Q因此想要在子线E来操作H体上的控gQ是 不可?单的通过控g对象名来操作Q但不是说不能进行操作,微Y提供了Invoke的方法,其作用就是让子线E告诉窗体线E来完成相应的控件操作?/p>

现在用一个用U程控制的进E条来说明,大致的步骤如下:(x)

1Q创建Invoke函数Q大致如下:(x)  
/// <summary>  
/// Delegate function be invoked by main thread  
/// </summary>  
private      void      InvokeFun()  
{  
     if(prgBar.Value< 100)  
     prgBar.Value = prgBar.Value + 1;  
}  

2Q子U程入口函数Q?nbsp; 
/// <summary>  
/// Thread function interface  
/// </summary>  
private void ThreadFun()  
{  
     // Create invoke method by specific function
     MethodInvoker mi = new MethodInvoker(this.InvokeFun);  

     for(int i=0; i<100; i++)  
     {  
       this.BeginInvoke(mi);    
       Thread.Sleep(100);  
     }  
}

3.创徏子线E:(x)  
Thread thdProcess = new Thread(new ThreadStart(ThreadFun));  
thdProcess.Start();  

Ҏ(gu)二:(x)
加入该句QControl.CheckForIllegalCrossThreadCalls = False     取消U线E安全保护模式!

Ҏ(gu)三:(x)带参?br /> 使用cR类的方法或cȝ属性都可以向线E传递参敎ͼ(x)
public class UrlDownloader
{
     string url;
  
     public UrlDownloader (string url)
     {
       this.url = url;
     }
  
     public void Download()
     {
       WebClient wc = new WebClient();
       Console.WriteLine("Downloading " + url);                        
       byte[] buffer = wc.DownloadData (url);
       string download = Encoding.ASCII.GetString(buffer);
       Console.WriteLine(download);
       Console.WriteLine("Download successful.");
    
       //q里你可以将downloadq行保存{处?.....
     }
}

[... 在另一个类中用它?..]
              
UrlDownloader downloader = new UrlDownloader (yourUrl);
new Thread (new ThreadStart (downloader.Download)).Start();

注意参数是如何传递的?/p>

Ҏ(gu)四:(x)带参?br /> ThreadStart starter = delegate { Download(yourUrl); };
new Thread(starter).Start();

//使用U程?br /> WaitCallback callback = delegate (object state) { Download ((string)state); };
ThreadPool.QueueUserWorkItem (callback, yourUrl);

Ҏ(gu)五:(x)带参?/strong>
Thread t = new Thread (new ParameterizedThreadStart(DownloadUrl));
t.Start (myUrl);
static void DownloadUrl(object url)
{
  // ....
}



smildlzj 2008-10-31 10:17 发表评论
]]>
c#遍历HashTablehttp://m.tkk7.com/smildlzj/articles/220576.htmlsmildlzjsmildlzjThu, 07 Aug 2008 02:05:00 GMThttp://m.tkk7.com/smildlzj/articles/220576.htmlhttp://m.tkk7.com/smildlzj/comments/220576.htmlhttp://m.tkk7.com/smildlzj/articles/220576.html#Feedback0http://m.tkk7.com/smildlzj/comments/commentRss/220576.htmlhttp://m.tkk7.com/smildlzj/services/trackbacks/220576.htmlhttp://blog.csdn.net/mike1983/archive/2008/06/20/2568647.aspx
Ҏ(gu)一

 foreach (System.Collections.DictionaryEntry objDE in objHasTab) {     Console.WriteLine(objDE.Key.ToString());     Console.WriteLine(objDE.Value.ToString()); }

 

Ҏ(gu)?/legend>

System.Collections.IDictionaryEnumerator enumerator = objHashTablet.GetEnumerator(); while (enumerator.MoveNext()) {     Console.WriteLine(enumerator.Key);         // Hashtable兛_?    Console.WriteLine(enumerator.Value);      // Hashtable?}



smildlzj 2008-08-07 10:05 发表评论
]]>
ArrayList用法 http://m.tkk7.com/smildlzj/articles/220574.htmlsmildlzjsmildlzjThu, 07 Aug 2008 02:03:00 GMThttp://m.tkk7.com/smildlzj/articles/220574.htmlhttp://m.tkk7.com/smildlzj/comments/220574.htmlhttp://m.tkk7.com/smildlzj/articles/220574.html#Feedback0http://m.tkk7.com/smildlzj/comments/commentRss/220574.htmlhttp://m.tkk7.com/smildlzj/services/trackbacks/220574.htmlSystem.Collections.ArrayListcL一个特D的数组。通过d和删除元素,可以动态改变数l的长度?/p>

一Q优?/p>

1。支持自动改变大的功能
2。可以灵zȝ插入元素
3。可以灵zȝ删除元素

二.局限?/p>

跟一般的数组比v来,速度上差?/p>

三.d元素

1QpublicvirtualintAdd(objectvalue);

对象添加到ArrayList的结֤

ArrayListaList=newArrayList();
aList.Add("a");
aList.Add("b");
aList.Add("c");
aList.Add("d");
aList.Add("e");
内容为abcde

2QpublicvirtualvoidInsert(intindex,objectvalue);

元素插入ArrayList的指定烦(ch)引处

ArrayListaList=newArrayList();
aList.Add("a");
aList.Add("b");
aList.Add("c");
aList.Add("d");
aList.Add("e");
aList.Insert(0,"aa");

l果为aaabcde

3QpublicvirtualvoidInsertRange(intindex,ICollectionc);

集合中的某个元素插入ArrayList的指定烦(ch)引处

ArrayListaList=newArrayList();
aList.Add("a");
aList.Add("b");
aList.Add("c");
aList.Add("d");
aList.Add("e");
ArrayListlist2=newArrayList();
list2.Add("tt");
list2.Add("ttt");
aList.InsertRange(2,list2);

l果为abtttttcde

四.删除

a)publicvirtualvoidRemove(objectobj);

从ArrayList中移除特定对象的W一个匹配项,注意是第一?/p>

ArrayListaList=newArrayList();
aList.Add("a");
aList.Add("b");
aList.Add("c");
aList.Add("d");
aList.Add("e");
aList.Remove("a");

l果为bcde

2.publicvirtualvoidRemoveAt(intindex);

U除ArrayList的指定烦(ch)引处的元?/p>

aList.Add("a");
aList.Add("b");
aList.Add("c");
aList.Add("d");
aList.Add("e");
aList.RemoveAt(0);

l果为bcde

3QpublicvirtualvoidRemoveRange(intindex,intcount);

从ArrayList中移除一定范围的元素。Index表示索引Qcount表示从烦(ch)引处开始的数目

aList.Add("a");
aList.Add("b");
aList.Add("c");
aList.Add("d");
aList.Add("e");
aList.RemoveRange(1,3);

l果为ae

4QpublicvirtualvoidClear();

从ArrayList中移除所有元素?/p>

五.排序

a)publicvirtualvoidSort();

对ArrayList或它的一部分中的元素q行排序?/p>

ArrayListaList=newArrayList();
aList.Add("e");
aList.Add("a");
aList.Add("b");
aList.Add("c");
aList.Add("d");
DropDownList1.DataSource=aList;//DropDownListDropDownList1;
DropDownList1.DataBind();

l果为eabcd

ArrayListaList=newArrayList();
aList.Add("a");
aList.Add("b");
aList.Add("c");
aList.Add("d");
aList.Add("e");
aList.Sort();//排序
DropDownList1.DataSource=aList;//DropDownListDropDownList1;
DropDownList1.DataBind();

l果为abcde

b)publicvirtualvoidReverse();

ArrayList或它的一部分中元素的序反{?/p>

ArrayListaList=newArrayList();
aList.Add("a");
aList.Add("b");
aList.Add("c");
aList.Add("d");
aList.Add("e");
aList.Reverse();//反{
DropDownList1.DataSource=aList;//DropDownListDropDownList1;
DropDownList1.DataBind();
l果为edcba

六.查找

a)publicvirtualintIndexOf(object);
b)publicvirtualintIndexOf(object,int);
c)publicvirtualintIndexOf(object,int,int);

q回ArrayList或它的一部分中某个值的W一个匹配项的从零开始的索引。没扑ֈq回-1?/p>

ArrayListaList=newArrayList();
aList.Add("a");
aList.Add("b");
aList.Add("c");
aList.Add("d");
aList.Add("e");
intnIndex=aList.IndexOf(“a”);//1
nIndex=aList.IndexOf(“p”);//没找刎ͼ-1
d)publicvirtualintLastIndexOf(object);
e)publicvirtualintLastIndexOf(object,int);
f)publicvirtualintLastIndexOf(object,int,int);

q回ArrayList或它的一部分中某个值的最后一个匹配项的从零开始的索引?/p>

ArrayListaList=newArrayList();
aList.Add("a");
aList.Add("b");
aList.Add("a");//?
aList.Add("d");
aList.Add("e");
intnIndex=aList.LastIndexOf("a");//gؓ(f)2而不?

g)publicvirtualboolContains(objectitem);

定某个元素是否在ArrayList中。包含返回true,否则q回false

七.其他

1QpublicvirtualintCapacity{get;set;}

获取或设|ArrayList可包含的元素数?/p>

2QpublicvirtualintCount{get;}

获取ArrayList中实际包含的元素数?br /> Capacity是ArrayList可以存储的元素数。Count是ArrayList中实际包含的元素数。CapacityL大于或等于Count。如果在d元素ӞCount过CapacityQ则该列表的定w?x)通过自动重新分配内部数组加倍?br /> 如果Capacity的值显式设|,则内部数l也需要重新分配以容纳指定的容量。如果Capacity被显式设|ؓ(f)0Q则公共语言q行库将其设|ؓ(f)默认定w。默认容量ؓ(f)16?br /> 在调用Clear后,Count?Q而此时Capacity切是默认定w16Q而不?

3QpublicvirtualvoidTrimToSize();

容量设|ؓ(f)ArrayList中元素的实际数量?br /> 如果不向列表中添加新元素Q则此方法可用于最化列表的内存系l开销?br /> 若要完全清除列表中的所有元素,请在调用TrimToSize之前调用ClearҎ(gu)。截ȝArrayList?x)将ArrayList的容量设|ؓ(f)默认定wQ而不是零?/p>

ArrayListaList=newArrayList();
aList.Add("a");
aList.Add("b");
aList.Add("c");
aList.Add("d");
aList.Add("e");//Count=5,Capacity=16,
aList.TrimToSize();//Count=Capacity=5;



smildlzj 2008-08-07 10:03 发表评论
]]>
C#快速排序类http://m.tkk7.com/smildlzj/articles/220561.htmlsmildlzjsmildlzjThu, 07 Aug 2008 01:14:00 GMThttp://m.tkk7.com/smildlzj/articles/220561.htmlhttp://m.tkk7.com/smildlzj/comments/220561.htmlhttp://m.tkk7.com/smildlzj/articles/220561.html#Feedback0http://m.tkk7.com/smildlzj/comments/commentRss/220561.htmlhttp://m.tkk7.com/smildlzj/services/trackbacks/220561.html
CSDN - 文档中心 - .NET 阅读Q?span id="ArticleTitle1_ArticleTitle1_lblReadCount">1338   评论Q?0    参与评论
标题   【算法】C#快速排序类     选择?lovewangshu ?Blog
关键?/font>   【算法】C#快速排序类
出处  

快速排序的基本思想是基于分ȝ略的。对于输入的子序列ap..arQ如果规模够小则直接进行排序,否则分三步处理:(x)

分解(Divide)Q?/strong>输入的序列ap..ar划分成两个非I子序列ap..aq和aq+1..arQap..aq中Q一元素的g大于aq+1..ar中Q一元素的倹{?nbsp;
递归求解(Conquer)Q?/strong>通过递归对p..aq和aq+1..arq行排序?nbsp;
合ƈ(Merge)Q?/strong>׃对分解出的两个子序列的排序是地q行的,所以在ap..aq和aq+1..ar都排好序后不需要执行Q何计ap..ar已排好序?nbsp;
q个解决程是符合分L的基本步骤的。因此,快速排序法是分L的经典应用实例之一?

using System;

namespace VcQuickSort
{
 /// <summary>
 /// ClassQuickSort 快速排序?br />  /// 范维?br />  /// </summary>

 public class QuickSort
 {
  public QuickSort()
  {
  }

  private void Swap(ref int i,ref int j)
  //swap two integer
  {
   int t;
   t=i;
   i=j;
   j=t;
  }
  
  public void Sort(int [] list,int low,int high)
  {
   if(high<=low)
   {
    //only one element in array list
    //so it do not need sort
    return;
   }
   else if (high==low+1)
   {
    //means two elements in array list
    //so we just compare them

    if(list[low]>list[high])
    {
     //exchange them
     Swap(ref list[low],ref list[high]);
     return;
    }
   }
   //more than 3 elements in the arrary list
   //begin QuickSort

   myQuickSort(list,low,high);
  }

  public void myQuickSort(int [] list,int low,int high)
  {
   if(low<high)
   {
    int pivot=Partition(list,low,high);
    myQuickSort(list,low,pivot-1);
    myQuickSort(list,pivot+1,high);
   }
  }

  private int Partition(int [] list,int low,int high)
  {
   //get the pivot of the arrary list
   int pivot;
   pivot=list[low];
   while(low<high)
   {
    while(low<high && list[high]>=pivot)
    {
     high--;
    }
    if(low!=high)
    {
     Swap(ref list[low],ref list[high]);
     low++;
    }
    while(low<high && list[low]<=pivot)
    {
     low++;
    }
    if(low!=high)
    {
     Swap(ref list[low],ref list[high]); 
     high--;
    }
   }
   return low;
  }

 }
}




smildlzj 2008-08-07 09:14 发表评论
]]>
在Visual C#中用ListView昄数据记录http://m.tkk7.com/smildlzj/articles/216861.htmlsmildlzjsmildlzjWed, 23 Jul 2008 05:26:00 GMThttp://m.tkk7.com/smildlzj/articles/216861.htmlhttp://m.tkk7.com/smildlzj/comments/216861.htmlhttp://m.tkk7.com/smildlzj/articles/216861.html#Feedback0http://m.tkk7.com/smildlzj/comments/commentRss/216861.htmlhttp://m.tkk7.com/smildlzj/services/trackbacks/216861.html using System ;
using System.Windows.Forms ;
using System.Drawing ;
using System.Data ;
using System.Data.OleDb ;
class MainForm : Form
{ // 定义数据q接的字W串
private static string strConnect = "Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = " +
Application.StartupPath + "\\MY.MDB" ;
private OleDbConnection conConnection = new OleDbConnection ( strConnect ) ;
private ListView lv ;
public MainForm ( )
{
// 初始化Form
this.Left = 0 ;
this.Top = 0 ;
this.Text = "在ListView中显C数据库内容!" ;

// 初始化ListView
lv = new ListView ( ) ;
lv.Left = 0 ;
lv.Top = 0 ;
lv.Width = 700 ;
lv.Height = this.ClientRectangle.Height ;
lv.GridLines = true ; file://昄各个记录的分隔线
lv.FullRowSelect = true ; file://要选择是一?br /> lv.View = View.Details ; file://定义列表昄的方?br /> lv.Scrollable = true ; file://需要时候显C滚动条
lv.MultiSelect = false ; // 不可以多行选择
lv.HeaderStyle = ColumnHeaderStyle.Nonclickable ;
// 针对数据库的字段名称Q徏立与之适应昄表头
lv.Columns.Add ( "姓名" , 60 , HorizontalAlignment.Right ) ;
lv.Columns.Add ( "住宅?sh)? , 100 , HorizontalAlignment.Left ) ;
lv.Columns.Add ( "办公?sh)? , 100 , HorizontalAlignment.Left ) ;
lv.Columns.Add ( "Ud?sh)? , 100 , HorizontalAlignment.Left ) ;
lv.Columns.Add ( "居住地点" , 100 , HorizontalAlignment.Left ) ;
lv.Columns.Add ( "工作单位" , 100 , HorizontalAlignment.Left ) ;
lv.Columns.Add ( "?sh)子邮g" , 100 , HorizontalAlignment.Left ) ;
lv.Visible = true ;

OleDbDataReader reader ;
string strCommand = "SELECT * FROM Persons" ;
this.conConnection.Open ( ) ;// 打开数据q接
OleDbCommand cmd = new OleDbCommand ( strCommand , conConnection ) ;
reader = cmd.ExecuteReader ( ) ;//获得数据?br /> // 不断往列表中添加数据记?br /> while ( reader.Read ( ) )
{
ListViewItem li = new ListViewItem ( ) ;
li.SubItems.Clear ( ) ;
li.SubItems[0].Text = reader["name"].ToString ( ) ;
li.SubItems.Add ( reader["HomePhone"].ToString ( ) ) ;
li.SubItems.Add ( reader["WorkPhone"].ToString ( ) ) ;
li.SubItems.Add ( reader["MobilePhone"].ToString ( ) ) ;
li.SubItems.Add ( reader["City"].ToString ( ) ) ;
li.SubItems.Add ( reader["Address"].ToString ( ) ) ;
li.SubItems.Add ( reader["Email"].ToString ( ) ) ;
lv.Items.Add ( li ) ;
}
reader.Close ( ) ; // 关闭数据?br /> // 在Form中添加此列表
this.Controls.Add ( lv ) ;
// 关闭Form的时候,同时也关闭数据连?br /> this.Closed+=new EventHandler ( this_Closed ) ;
}
protected void this_Closed ( object sender , EventArgs eArgs )
{
this.conConnection.Close ( ) ; file://关闭数据q接
}
public static void Main ( )
{
Application.Run ( new MainForm ( ) ) ;
}
}

  在成功编译了上面源程序代码以后,在同一目录下徏立一个Acess 2000的数据库Q命名ؓ(f)MY.MDBQ然后在其中建立一张数据表Q字D如下:(x)nameQHomePhoneQW(xu)orkPhoneQMobilePhoneQCityQAddressQEmail。此时运行编译后的程序就可以得到如下q行界面Q?br />

         ?1Q用ListView昄数据记录


smildlzj 2008-07-23 13:26 发表评论
]]>
C#获取当前路径http://m.tkk7.com/smildlzj/articles/216622.htmlsmildlzjsmildlzjTue, 22 Jul 2008 07:24:00 GMThttp://m.tkk7.com/smildlzj/articles/216622.htmlhttp://m.tkk7.com/smildlzj/comments/216622.htmlhttp://m.tkk7.com/smildlzj/articles/216622.html#Feedback0http://m.tkk7.com/smildlzj/comments/commentRss/216622.htmlhttp://m.tkk7.com/smildlzj/services/trackbacks/216622.html
string str1 =Process.GetCurrentProcess().MainModule.FileName;//可获得当前执行的exe的文件名?nbsp; 

string str2=Environment.CurrentDirectory;//获取和设|当前目录(卌q程从中启动的目录)的完全限定\径?br />

//备注 按照定义Q如果该q程在本地或|络驱动器的根目录中启动Q则此属性的gؓ(f)驱动器名U后跟一个尾部反斜杠Q如“C:\”Q。如果该q程在子目录中启动,则此属性的gؓ(f)不带N反斜杠的驱动器和子目录\径(?#8220;C:\mySubDirectory”Q?/p>

string str3=Directory.GetCurrentDirectory();//获取应用E序的当前工作目录?/span>

string str4=AppDomain.CurrentDomain.BaseDirectory;//获取基目录,它由E序集冲H解决程序用来探程序集?/span>

string str5=Application.StartupPath;//获取启动了应用程序的可执行文件的路径Q不包括可执行文件的名称?/span>

string str6=Application.ExecutablePath;//获取启动了应用程序的可执行文件的路径Q包括可执行文g的名U?/span>

string str7=AppDomain.CurrentDomain.SetupInformation.ApplicationBase;//获取或设|包含该应用E序的目录的名称?br />

1.      System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName

        获取模块的完整\径?/p>

2.      System.Environment.CurrentDirectory

        获取和设|当前目?该进E从中启动的目录)的完全限定目录?/p>

3.      System.IO.Directory.GetCurrentDirectory()

        获取应用E序的当前工作目录。这个不一定是E序从中启动的目录啊Q有可能E序攑֜C:\www?q个函数有可能返回C:\Documents and Settings\ZYB\,或者C:\Program Files\Adobe\,有时不一定返回什么东东,我也搞不懂了?/p>

4.     System.AppDomain.CurrentDomain.BaseDirectory

        获取E序的基目录?/p>

5.     System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase

        获取和设|包括该应用E序的目录的名称?/p>

6.     System.Windows.Forms.Application.StartupPath

        获取启动了应用程序的可执行文件的路径。效果和2?一栗只?q回的字W串后面多了一?\"而已

7.     System.Windows.Forms.Application.ExecutablePath

        获取启动了应用程序的可执行文件的路径?qing)文件名Q效果和1一栗?

对于WindowsE序 和W(xu)eb 应用E序来说,他们q行的\径是不一L(fng),所以关键是判断当前q行的程序是哪种E序.于是我们可以使用如下的代?

string path = "";

           if (System.Environment.CurrentDirectory == AppDomain.CurrentDomain.BaseDirectory)//Windows应用E序则相{?/p>

           ...{

                 path = AppDomain.CurrentDomain.BaseDirectory;

             }

           else

           ...{

                 path = AppDomain.CurrentDomain.BaseDirectory + "Bin\";

             }

q样如果我们写了一个类?cd中用CAssembly.LoadFrom,׃是通用cd,所以可能用到WindowsE序中也可能用到Web?那么用上面的代码很方便?

1、Server.MapPath

2、System.Windows.Forms.StartupPath

3、Type.Assembly.Location

Ҏ(gu)2可以应用于控制台应用E序QW(xu)inForm应用E序QW(xu)indows服务Q方?可以应用于Web应用E序Q方?都可以应用?/p>

但方?是加载应用程序的路径。如果是Web应用E序Q取得的路径是C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files目录。所以Web目q是使用Server.MapPath吧。否则徏议用方?。如果自己新建类库。可以加入对System.Windows.Forms.StartupPath的引用后使用?/p>

smildlzj 2008-07-22 15:24 发表评论
]]>
վ֩ģ壺 ֻѵAVߵӰ| ԻƵ߿Ƭ| ëƬAV뾫Ʒҹ| ƷһëƬƵۿ | ɫ޾ƷĻ| ŷƷպһ| ĻƷþ| ͺˬӲƵ| ѹۿ| ޾ƷƬ߹ۿ| ޹Ů߹ۿ| ҹaëƬ| ޳վ| ޵һӰԺ| ޹Ʒþþ| һ߹ۿ| ŮƵ| ˿ۺ| ޾Ʒ͵Բ| Ļһ| պѵӰ߹ۿ| ޾Ʒ**ëƬ| CAOPORNƷƵ| Ů18ëƬëƬ| þþþ޾ƷŮ| һػɫëƬѿ| aëƬ| AV벻߲| ˾ҹƵѹ| ձXXXѿ| þþƷһ| Ʒɫʹ | ޺ݺۺϾþþþ | AëƬڵ| ޳avӰԺ| רëƬ߳ˮ| ˬִ̼APP| þþۺɫһ| jizzձ| ˿| ɫ͵Ʒһ|