2006年08月30日

摘 要 本文从页面、数据访问、字符串操作三方面探讨如何提高ASP.NET应用程序的性能,并提供了几种测试工具用于检测ASP.NET网站性能。

  关键词 ASP.NET 应用程序 性能 优化

  网站的性能对于ASP.NET程序开发人员来说非常重要。一个优秀的网站虽然有美观的页面设计,完善的服务功能,但是打开网页时有长时间的延迟,用户最终将会无法忍受。尤其对于大型的电子商务网站而言,每秒钟有数万用户同时访问,没有良好的网站性能,根本无法满足庞大的需求。

  ASP.NET作为全新一代的动态网页生成系统,它在平台性能方面与原有的ASP相比已有了一个本质的提高。但要在此基础上开发出专业水准的、符合生产标准的、受用户欢迎的web应用程序,还需要开发人员从编程的角度在页面、数据访问和字符串处理等各方面进行优化处理,以提高网站的总体性能。

  本文将主要探讨在ASP.NET中与此相关的几种进行性能优化的方法及注意问题。

  页面性能优化

  1、会话状态的恰当选择

  HTTP协议是一种无状态的通信协议,无法记录和识别来自不同客户端的请求,但在实际应用中系统却要维护来自客户端的不同请求之间的会话状态信息。ASP.NET通过将会话状态信息存储在进程、状态服务器或SQL Server数据库中来解决这个问题。

  将会话状态信息保存在WEB服务器的内存中具有最佳的性能,速度很快,但是却缺乏会话状态信息跨越多个服务器的能力。若要在多个WEB服务器之间维护会话信息,可以使用状态服务器进行存储,这种方式由于可以将应用程序部署到多台服务器上而提高了系统的伸缩性和可靠性,但是以降低性能为代价。对于极其重要的会话信息,需要使用SQL Server存储方式,从而避免丢失重要的会话信息,但由此产生的工作负载比前两者大得多。

  若不考虑状态信息的保留和多个服务器共享,应尽量选择保存在服务器的进程中,从而得到最佳的性能。

  会话状态信息的存储方式选择通过web.config文件:

<sessionState
mode="InProc/StateServer/SqlServer" //存储方式由此行选择
stateConnectionString="tcpip=127.0.0.1:42424"
……
timeout="20"/>

  2、服务器控件的优化选择

  2.1 减少不必要的服务器控件

  服务器控件带来的方便和功能是html控件所不能比拟的。但是每一个服务器控件都需要在服务器端创建相应的对象,是以牺牲服务器端的资源为代价的,过多的使用服务器控件会极大的影响程序性能。

  很多情况下,简单地使用html标记或数据绑定即能够实现所需功能。比如<asp:Label>控件,若使用它来显示静态信息,则完全可用简单的标记来实现。如果html控件达不到所要实现的功能,而且在脚本语言如javascript、vbscript也不能实现的情况下,才考虑选择服务器控件。

  2.2 禁用不必要的状态视图

  服务器控件的状态视图属性能够自动的在页面往返过程中维护服务器控件的状态,减少开发者的工作量,但是需要占用大量的服务器内存资源。因此,在不需要服务器控件状态视图的情况下,应将其EnableViewState属性设置为false,如常用的<asp:Lable>和<asp:Button>控件。

  2.3 Page.IsPostBack的运用

  Page.IsPostBack用于记录页面是否从客户端返回,若为false表示初次运行,否则表示从客户端再次返回该页面。Page.IsPostBack的合理应用可以避免页面在往返过程中的一些不必要的操作。在Page_Load函数及一些只需要初始化一次的事件函数中均可以使用该属性来提高应用程序性能。

void Page_Load(Object o, EventArgs e)
{
 if(! Page.IsPostBack)
 {
  conn=new SqlConnection("server=localhost;uid=sa;pwd=;database=data");
  String sql="select * from student";
  cmd.Fill(ds,"stu");
  mydataGrid.DataBind();
 }
}

  以上代码将保证只有在首次访问该页面时对数据库进行读取并绑定。

  2.4 合理使用DataGrid控件

  DataGrid控件带有最强大的数据显示功能,还内置了对数据的修改、删除、添加、分页等很多功能。如果只需简单的显示数据, DataGrid并非最佳选择。DataGrid控件的分页功能,数据的存储方式(存储在viewstate中)等,虽然让程序开发者使用方便快捷,但由此产生的性能开销不容小视。

  DataList控件比DataGrid功能少了很多。但自定义性强了很多。特有的多行数据显示还是比较方便的。DataGrid能实现的功能,它基本能实现。

  Repeater控件功能最少,但自定义性非常强。由于减少了很多功能,对服务器的性能带来消耗最小。

  因此,在只需简单显示数据列表时,选择Repeater或DataList控件同样可以达到目的,而且减轻了性能上的开销。

  数据库访问性能优化

  1、数据库的连接和关闭

  访问数据库资源需要创建连接、打开连接和关闭连接几个操作。这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源。ASP.NET中提供了连接池(Connection Pool)改善打开和关闭数据库对性能的影响。系统将用户的数据库连接放在连接池中,需要时取出,关闭时收回连接,等待下一次的连接请求。

  连接池的大小是有限的,如果在连接池达到最大限度后仍要求创建连接,必然大大影响性能。因此,在建立数据库连接后只有在真正需要操作时才打开连接,使用完毕后马上关闭,从而尽量减少数据库连接打开的时间,避免出现超出连接限制的情况。

  2、使用存储过程

  存储过程是存储在服务器上的一组预编译的SQL语句,类似于DOS系统中的批处理文件。存储过程具有对数据库立即访问的功能,信息处理极为迅速。使用存储过程可以避免对命令的多次编译,在执行一次后其执行规划就驻留在高速缓存中,以后需要时只需直接调用缓存中的二进制代码即可。

  另外,存储过程在服务器端运行,独立于ASP.NET程序,便于修改,最重要的是它可以减少数据库操作语句在网络中的传输。

  3、优化查询语句

  ASP.NET中ADO连接消耗的资源相当大,SQL语句运行的时间越长,占用系统资源的时间也越长。因此,尽量使用优化过的SQL语句以减少执行时间。比如,不在查询语句中包含子查询语句,充分利用索引等。

  字符串操作性能优化

  1、使用值类型的ToString方法

  在连接字符串时,经常使用"+"号直接将数字添加到字符串中。这种方法虽然简单,也可以得到正确结果,但是由于涉及到不同的数据类型,数字需要通过装箱操作转化为引用类型才可以添加到字符串中。但是装箱操作对性能影响较大,因为在进行这类处理时,将在托管堆中分配一个新的对象,原有的值复制到新创建的对象中。

  使用值类型的ToString方法可以避免装箱操作,从而提高应用程序性能。

  2、运用StringBuilder类

  String类对象是不可改变的,对于String对象的重新赋值在本质上是重新创建了一个String对象并将新值赋予该对象,其方法ToString对性能的提高并非很显著。

  在处理字符串时,最好使用StringBuilder类,其.NET 命名空间是System.Text。该类并非创建新的对象,而是通过Append,Remove,Insert等方法直接对字符串进行操作,通过ToString方法返回操作结果。

  其定义及操作语句如下所示:

int num;
System.Text.StringBuilder str=new System.Text.StringBuilder(); //创建字符串
str.Append(num.ToString()); //添加数值num
Response.Write(str.ToString); //显示操作结果

  ASP.NET应用程序性能测试

  在对ASP.NET应用程序进行性能测试之前,应确保应用程序没有错误,而且功能正确。具体的性能测试可以采用以下工具进行:
Web Application Strees Tool (WAS)是Microsoft发布的一个免费测试工具,可以从http://webtool.rte.microsoft.com/上下载。它可以模拟成百上千个用户同时对web应用程序进行访问请求,在服务器上形成流量负载,从而达到测试的目的,可以生成平均TTFB、平均TTLB等性能汇总报告。

  Application Center Test (ACT) 是一个测试工具,附带于Visual Studio.NET的企业版中,是Microsoft正式支持的web应用程序测试工具。它能够直观地生成图表结果,功能比WAS多,但不具备多个客户机同时测试的能力。

  服务器操作系统"管理工具"中的"性能"计数器,可以对服务器进行监测以了解应用程序性能。

  结论

  对于网站开发人员来说,在编写ASP.NET应用程序时注意性能问题,养成良好的习惯,提高应用程序性能,至少可以推迟必需的硬件升级,降低网站的成本。

web开发人员是否必须掌握复杂的组件技术才能加快html页面的访问速度?答案是:不一定!实际上,有许多关于HTML与DHTML方面的技巧,它们原理简单而且上手容易。无论是技术高超的老手,还是初涉编程的菜鸟,领会这些都十分必要。

  明显HTML,暗渡“公用脚本”减少web页面下载时间的关键就是设法减小文件大小。

  当多个页面共用一些成分内容时,就可以考虑将这些公用部分单独分离出来。比如:我们可以将多个HTML页面都用到的脚本程序编写成独立存在的.js文件,然后再在页面中按如下方式调用它:

<script src="myfile.js"> </script>

  这样,公用文件只需要下载一次,然后就进入缓冲区。等下次再次调用包含公用文件的html页面时,下载时间明显减少。

  让样式表内容进入地下工作

  CSS是HTML装扮器,一个漂亮的Web页面不可能没有它。HTML页面中有多种引用CSS的方法,不同的方法导致的效率也不一样。通常,我们可以将定义于<style> </style> 间的样式控制代码提取出来,保存到单独的.css文件中,然后在HTML页面中以<LINK> 标记或者@import标记的方式进行引用:

<style>

@import url("mysheet1.css");

</style>

  请注意2点:1、.css文件中无需包括<style> 标记;2、@import和LINK标记要定义在HTML页面的HEAD部分。

  宝贵内存节省两法

  尽量减少HTML页面占用的内存空间是加快页面下载速度的一个有效方法。在这方面,有2个需要注意的问题:

  1、使用同一种脚本语言

  HTML页面离不开脚本程序的支持,我们经常会在页面中嵌入多种脚本语言,比如JavaScript与VBScript。但是,不知你发觉没有:这样的混合使用减慢了页面的访问速度。原因在于:要解释并运行多种脚本代码,就必须在内存中装载多种脚本引擎。所以,请尽量在页面中使用同一种脚本语言编写代码。

  2、巧用IFrame

  你使用过<IFRAME> 标记吗?它可是一个非常美妙的功能。如果要在一个HTML文档中包含第2个页面的内容,通常的方法是使用<FRAMESET> 标记。但是有了<IFRAME> ,一切变得简单了。比如,开发一个文档预览页面,可以在左边放置一系列主题,在右边放置一个IFRAME,其中包含要预览的文档;当鼠标掠过左边的每一个主题链接时,就在右边建立一个新的IFRAME以预览文档。这样做,代码效率无疑是高效的,但同时导致了繁重的处理过程,最终是缓慢的速度。

  没关系,我们有办法:只使用单一的IFRAME。当鼠标指向一个新主题时,只需要修改IFRAME元素的SRC属性即可。这样,任何时间内只会有一个预览文档保留在内存。

  择优选用动画定位属性

  每天上网浏览页面,你一定会看到许多动画效果。比如,一个可爱的小兔子在页面上来回地走动 … 实现这个效果的核心技术就是CCS定位。通常,我们是使用element.style.left和element.style.top2个属性来达到图形定位的目的。但是,这样做会产生一些问题:left属性返回一个字符串,并且其中包含了度量单位(比如100px)。因此,要设定新的位置坐标,就必须首先对这个字符串返回值进行处理,然后才能赋值,象下面一样:

dim stringLeft, intLeft

stringLeft = element.style.left

intLeft = parseInt(stringLeft)

intLeft = intLeft + 10

element.style.left = intLeft;

  你一定会感觉做这么点事情竟要编写这么复杂的代码,是否有更简洁的方法?当然有!请看这4个属性:posLeft、posTop、posWidth 和 posHeight,它们对应于相应字符串返回值的点数数值。好了,使用这些属性重新编写代码实现上面代码实现的功能:

element.style.posLeft += 10

  代码短小、速度却更快!

  循环控制多个动画

  说到制作动画效果,当然离不开定时器的运用。通常的方法就是使用window.setTimeout来不断地定位页面上的元素。但是,如果页面上有多个动画要显示,是不是就要设定多个定时器呢?答案是No!原因很简单:定时器功能将消耗掉大量宝贵的系统资源。可是我们仍能在页面上控制多个动画,技巧就是使用一个循环。在循环中根据不同的变量值控制相应动画的位置,整个循环中只使用一个window.setTimeout()函数调用。

  Visibility快于Display

  让图画时隐时现会创造很有趣的效果,有2种方法可以实现这个目的:使用CSS的visibility属性或者display属性。对于绝对位置元素,diaplay和visibility具有同样的效果。两者的区别在于:设置为display:none的元素将不再占用文档流的空间,而设置为visibility:hidden的元素仍然保留原位置。

  但是如果要处理绝对位置的元素,使用visibility会更快。

  从小处着手

  编写DHTML网页的一个重要提示是:从小处着手。初次编写DHTML页面时,一定不要试图在页面中使用你了解到的全部DHTML功能。每次可以只使用一个单一的新特征,并且仔细地观察由此产生的变化。如果发现性能有所下降,就可以快速地找到为什么。

  脚本的DEFER化

  DEFER是脚本程序强大功能中的一个“无名英雄”。你可能从没有使用过它,但是看完这里的介绍后,相信你就离不开它。它告诉浏览器Script段包含了无需立即执行的代码,并且,与SRC属性联合使用,它还可以使这些脚本在后台被下载,前台的内容则正常显示给用户。

  最后请注意两点:

  1、不要在defer型的脚本程序段中调用document.write命令,因为document.write将产生直接输出效果。

  2、而且,不要在defer型脚本程序段中包括任何立即执行脚本要使用的全局变量或者函数。

  保持同一URL的大小写一致性

  我们都知道UNIX服务器是大小写敏感的,但是你知道吗:Internet Explorer的缓冲区也是区别对待大小写字符串的。因此,作为web开发者,一定要记住保持相同链接的URL字符串在不同位置的大小写的一致性。否则,就会在浏览器的缓冲区中存放同一位置的不同文件备份,也增加了下载同一位置内容的请求次数。这些都无疑降低了web访问效率。所以请谨记:同一位置的URL,在不同页面中请保持URL字符串的大小写一致性。

  让标记有始有终

  自己编写或者查看他人的HTML代码时,我们一定都遇到过标记有头无尾的情况。比如:

<P> 有头无尾标记举例
<UL>
<LI> 第一个
<LI> 第二个
<LI> 第三个
</UL>

  很明显,上面的代码中缺少三个</LI> 结束标记。但是这并不妨碍它的正确执行。在HTML中,这样的标记还有一些,例如FRAME、IMG和P。

  可是请不要偷懒,请将结束标记写完整,这样做不仅使HTML代码格式规范,更可以加速页面的显示速度。因为Internet Explorer将不会花费时间判断和计算段落或者列表项目在哪里结束。

<P> 有头有尾标记举例</P>
<UL>
<LI> 第一个</LI>
<LI> 第二个</LI>
<LI> 第三个</LI>
</UL>

  OK,以上列举了有关加速HTML页面的10个处理技巧,描述这些很简单,但是只有真正领会并掌握其中的本质,并且举一反三,才会编写出更快、更好的程序。

为了优化网站的访问速度,准备采用HttpCompressionModule 6对传输数据进行压缩,下载了HttpCompressionModule 6 , 并按照示例程序中的web.config配置了网站web.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
   <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
   <sectionGroup name="blowery.web">
         <section name="httpCompress" type="blowery.Web.HttpCompress.SectionHandler, blowery.Web.HttpCompress"/>
      </sectionGroup>
     </configSections>
  <appSettings>
    <add key="FCKeditor:UserFilesPath" value="/KeyuSoftShanyou/UserFiles" />
    <add key="SearchIndexDir" value="~/index" />
  </appSettings>
 
 
  <!– config section for my http module –>
  <blowery.web>
    <!–
   Here’s an example on how to change the algorithm or compression level
   
      <compressionModule preferredAlgorithm="deflate|gzip" compressionLevel="high|normal|low"/>
   
   so, to use deflate by default, and high compression, you would use the following line
   –>
    <httpCompress preferredAlgorithm="gzip" compressionLevel="high">
      <excludedMimeTypes>
        <add type="image/jpeg"/>
        <add type="image/png"/>
        <add type="image/gif"/>
      </excludedMimeTypes>
      <excludedPaths>
        <!–<add path="NoCompress.aspx"/>–>
      </excludedPaths>
    </httpCompress>
  </blowery.web>
 
  <system.web>  
    
    
     <httpModules>
 <!– <add type="KeyuSoftShanyou.Util.NHSessionModule, KeyuSoftShanyou" name="NHSessionModule" />–>
         <add name="CompressionModule" type="blowery.Web.HttpCompress.HttpModule, blowery.web.HttpCompress"/>
     </httpModules>
 
  
    <authentication mode="Forms">
  <forms name="shanyouCookie" loginUrl="Admin/login.aspx" protection="All" timeout="90"/>
 </authentication> 

    <authorization>  <allow users="*" />   </authorization>

    <compilation        defaultLanguage="c#"      debug="true"  />
    <customErrors   defaultRedirect="Error.aspx"  mode="RemoteOnly" />

    <trace   enabled="false"    requestLimit="10"        pageOutput="false"
        traceMode="SortByTime"
  localOnly="true"
    />

 
    <sessionState
            mode="InProc"
            stateConnectionString="tcpip=127.0.0.1:42424"
            sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
            cookieless="false"
            timeout="20"
    />

    <globalization  requestEncoding="utf-8" responseEncoding="utf-8" />
     <!– 2003-12-03, Rob Eberhardt – http://slingfive.com/demos/browserCaps/  firefox 浏览器问题 –>

<browserCaps>
  <!– GECKO Based Browsers (Netscape 6+, Mozilla/Firebird, …) //–>
  <case match="^Mozilla/5\.0 \([^)]*\) (Gecko/[-\d]+)? (?’type’[^/\d]*)([\d]*)/(?’version’(?’major’\d+)(?’minor’\.\d+)(?’letters’\w*)).*">
    browser=Gecko
    type=${type}
    frames=true
    tables=true
    cookies=true
    javascript=true
    javaapplets=true
    ecmascriptversion=1.5
    w3cdomversion=1.0
    css1=true
    css2=true
    xml=true
    tagwriter=System.Web.UI.HtmlTextWriter
    <case match="rv:(?’version’(?’major’\d+)(?’minor’\.\d+)(?’letters’\w*))">
      version=${version}
      majorversion=${major}
      minorversion=${minor}
      <case match="^b" with="${letters}">
        beta=true
      </case>
    </case>
  </case>
 
  <!– AppleWebKit Based Browsers (Safari…) //–>
  <case match="AppleWebKit/(?’version’(?’major’\d)(?’minor’\d+)(?’letters’\w*))">
    browser=AppleWebKit
    version=${version}
    majorversion=${major}
    minorversion=0.${minor}
    frames=true
    tables=true
    cookies=true
    javascript=true
    javaapplets=true
    ecmascriptversion=1.5
    w3cdomversion=1.0
    css1=true
    css2=true
    xml=true
    tagwriter=System.Web.UI.HtmlTextWriter
    <case match="AppleWebKit/(?’version’(?’major’\d)(?’minor’\d+)(?’letters’\w*))( \(KHTML, like Gecko\) )?(?’type’[^/\d]*)/.*$">
      type=${type}
    </case>
  </case>
  <!– Konqueror //–>
  <case match = "Konqueror/(?’version’(?’major’\d+)(?’minor’\.\d+)(?’letters’));\w*(?’platform’[^\)]*)">
    browser=Konqueror
    version=${version}
    majorversion=${major}
    minorversion=${minor}
    platform=${platform}
    type=Konqueror
    frames=true
    tables=true
    cookies=true
    javascript=true
    javaapplets=true
    ecmascriptversion=1.5
    w3cdomversion=1.0
    css1=true
    css2=true
    xml=true
    tagwriter=System.Web.UI.HtmlTextWriter
  </case>
</browserCaps>

 </system.web>
  <!– This section contains the log4net configuration settings –>
   <log4net>  <!– Define some output appenders –>
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
       <param name="File" value="log.txt" />
       <param name="AppendToFile" value="true" /> 
       <param name="MaxSizeRollBackups" value="2" />
       <param name="MaximumFileSize" value="100KB" /> 
       <param name="RollingStyle" value="Size" />  
       <param name="StaticLogFileName" value="true" />
       <layout type="log4net.Layout.PatternLayout">  
  <param name="Header" value="[Header]\r\n" />
  <param name="Footer" value="[Footer]\r\n" />  
  <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] – %m%n" /> 
       </layout>
     </appender> 
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">  
  <layout type="log4net.Layout.PatternLayout"> 
    <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] &lt;%X{auth}&gt; – %m%n" />  
    </layout>  </appender>  <!– Set root logger level to ERROR and its appenders –> 
    <root>
    <level value="ERROR" />
        <appender-ref ref="RollingLogFileAppender" /> 
        <appender-ref ref="ConsoleAppender" />
    </root> 
        <!– Print only messages of level DEBUG or above in the packages –>
      <logger name="IBatisNet.DataMapper.Configuration.Cache.CacheModel">
          <level value="DEBUG" />
       </logger>
             
        <logger name="IBatisNet.DataMapper.Configuration.Statements.PreparedStatementFactory"> 
             <level value="DEBUG" />
         </logger> 
     <logger name="IBatisNet.DataMapper.LazyLoadList"> 
     <level value="DEBUG" />
     </logger>
 </log4net>
 
</configuration>

使用效果:
使用HttpCompressionModule自带的Fetch工具进行测试,测试结果如下:
compression.png

测试结果说明:
第一行数据是未使用HttpCompressionModule的测试结果。
第二行数据是使用deflate压缩算法进行压缩后的测试结果。
第二列数据是Web服务器传递到浏览器的文件大小。很明显,压缩后传输数据大大减少,有效地节约了带宽。
TTFB
—首字节平均响应时间(Gets the number of milliseconds that have passed before the first byte of the response was received.
TTLB
—末字节平均响应时间(Gets the number of milliseconds that passed before the last byte of the response was received.
Transit
—传输数据到浏览器的时间。
从测试结果可以看出, 采用HttpCompressionModule后访问速度有明显改善。

 

http://www.asp.net/ControlGallery/ControlDetail.aspx?Control=696&tabindex=2

http://www.blowery.org/code/HttpCompressionModule.html

2006年08月28日

MonoDevelop 是用于 Mono 和 Gtk# 开发的全功能型 IDE,主要特性有:代码自动完成,类管理,内嵌帮助,工程管理,支持插件等。新版本加入了对于 .NET 2.0 的编译支持,并在打开文件对话框中增添了文件类型过滤功能,同时也修正了若干 Bug。
  此程序的使用依赖包括:GTK+ 2.6.x、Mono、GTK#、GtkSourceView#、Gecko#、Mono debugger(可选)、IKVM(可选)、Boo(可选)。
  下载 MonoDevelop 0.11 :

 

http://go-mono.com/sources/monodevelop/monodevelop-0.11.tar.gz

9月26日,著名的“Mono之父”,Nat Friedman先生将做客CSDN的嘉宾聊天室,与大家展开面对面的思想和技术交流!欢迎大家积极的发表意见和提出问题,我们将会专门的收集大家的反馈,以期更好的与大师进行交流。

时间:2005年9月26日下午14:30至16:30,地点:CSDN网上聊天室 http://chat.csdn.net:8892/

聊天活动此刻正在进行中,热烈的讨论正如火如荼。大家纷纷提出自己的疑惑,建议和看法。期待获得“Mono之父”的详细解答。

现场照片:

聊天室现场
Nat Freidman

近照
与翻译交谈

Nat Freidman签名
与工作人员合影

活动圆满结束!

近距离接触

主持人 :
本次聊天的主题是:研究Mono技术感受SuSE Linux魅力
[2005-9-26 14:15:00]

主持人 :
如果您有问题想问嘉宾,请直接向JDMBA提问,我们的工作人员会收集问题和提交给嘉宾。
[2005-9-26 14:26:00]

主持人 :
我们的聊天活动稍后马上开始。
[2005-9-26 14:33:00]

主持人 :
各位网友,大家好,我们现在正式开始了。
[2005-9-26 14:36:00]

主持人 :
各位网友大家好,我们今天的主题是感受Mono的魅力。我们请来了胡欣蔚先生,他是Novell中国的专家,现在各位网友可以提出问题,并将我们的问题提交给主持人。下面是我们这次活动收集的一些问题。 第一个问题是Mono项目现在不但表明了开源社区是力量非常强大,同时体现了联通一切的思想,Mono项目被认为是开源界的平台,请问一下Mono项目会对将来开发产生哪些深远的影响?
[2005-9-26 14:40:00]

主持人 :
我们已经有了新的编译器,为了吸引更多的开发人员进入这个社区我们需要一个功能更简单、内容更丰富、编程更容易,不容易出错的编辑语言,这就是在创办公司的时候就提出了这个计划,利用Mono可以更简单的使用已经有的开源的那些东西来进行开发,他们已经用到Mono做很多的软件。利用Mono可以更容易的把Windows下的程序员吸引过来,也便于Windows的程序员向Linux下迁移。
[2005-9-26 14:47:00]

主持人 :
在SUSE Linux Mono10会给大家带来什么新的更酷的特性?
[2005-9-26 14:48:00]

Nat Friedman:在SUSE Linux Mono 10里面会带一个全新版本的Mono,大概是1.2正式版本,因为我本身是做Linux桌面的,所以其中有很多特性非常好,第一个特性是新版面Mono有更好的垃圾收集机,1.2版本升级的时候可以对内存进行压缩,可以保证桌面应用,在随机操作时不会占用太多的物理内存。
[2005-9-26 14:50:00]

Nat Friedman:SQL server就有数千个客户端连上来进行各种各样的操作,可以确认Mono在这方面的性能越来越好。 还有一点,很令人激动的是有了一个完整实现的系统实现,在Windows和Linux上是完全一样的界面。还有很多的增强,Mono 1.2应该是一个很重要,并将是一个很吸引人的版本。
[2005-9-26 14:55:00]

网友:Linux的发展瓶颈一直是应用比较少,一直以来Linux java是比较喜欢选择的方案,现在Linux 和Mono又成了人们选择的一种方式。
[2005-9-26 14:56:00]

Nat Friedman:如果利用Java的简单的来说比较有名,它可以支持多种语言的,因此没有必要把Java分的那么清楚,因此我们有一些相应的技术可以实现。第二个有点Java底下如果要调用编码的话是非常难用的,而Mono提供的机制就简单得多,这样可以很容易把Linux平台上存在的成千上万的C或者C++更有效的利用起来。最后一点就是相对于Java来说,Mono是一个真正完全开放源代码的项目,如果真正需要一个完全开放的系统来做你的应用的话,那么Mono比Java更合适。
[2005-9-26 14:57:00]

网友:Mono本身是一个非常成功的项目,它的成功之路被认为是给开发者带来了RED的体验还是能帮助开发者开发出更安全的代码,跨平台性能更好的软件。
[2005-9-26 14:58:00]

Nat Friedman:Mono成功的一个最重要的原因是让开发过程变得容易和更加有趣。一般刚开始学习开发的时候比如说有一个小程序,能出现一个小窗口,是很有乐趣的,但是随着开发的程序越来越大,项目设计的内容越来越多,可能要花成倍的时间解决代码里面的Bug,这样让开发过程变得越来越误区,如果你使用Mono这项技术就可以最大程度的减少类似的问题,可以保证开发者的开发乐趣,我认为这是Mono成功的原因。 另外一个创始人在招人上面很有一套,能够招到最好的程序员做这件事情。
[2005-9-26 15:02:00]

网友:目前是否有大型的Web运行在Mono之上,如果把一个跑在Asp.net迁移到Mono上面需要多少工作量、迁好已经稳定性如何?
[2005-9-26 15:03:00]

Nat Friedman:你刚才说把一个ASP连接到一个程序上是不需要任何资源拿过来就可以用的,事实上上个月对开发中的1.1版本有很大的增强,实际上Novell和相当多基于Asp.net的企业开发合作,事实上Novell的Asp.net的实现是非常完整的,开发者可以很容易的把他的迁移到Mono上来。
[2005-9-26 15:03:00]

网友:我初学Linux的桌面开发需要什么样的步骤?
[2005-9-26 15:04:00]

Nat Friedman:这取决于你想做哪方面的应用。 第一部分就是你不一定完全写程序,事实上现在有很多很多的桌面应用,这些应用都是开源的,所以有一个很大的好处就是把这些应用直接集成起来,不一定要开发,事实上现在市场有这样的产品,使用Linux把桌面应用都整合起来就成为了一个完整的解决方案,那也是很好的事情。
[2005-9-26 15:07:00]

Nat Friedman:如果想成为一个Linux平台下的好程序员就是尽量多读和多写代码,至少每天得写近千条代码,才可以保证你在这方面收获。从读代码来说,读代码可以帮助你学习别人的代码,更重要的是可以训练你对代码里存在的各种模式更加熟悉,如果你要贡献到其他某一个已经有的程序里面,你首先要做的就是先阅读程序,看有没有里面在里面进行修改或者修定这个程序存在的某一个Bug,这样可以很快认识到这个程序里面存在的模式。
[2005-9-26 15:09:00]

Nat Friedman:另外现在在Linux桌面上已经有一些基于某种终端应用包括X-box这是做相机的处理软件,包括媒体播放软件,你可以先看这些软件来训练自己。另一方面写代码总是要的,你要尽可能的多写代码。我另外推荐一下你看下“tom boy”的程序,那个代码写的非常干净。
[2005-9-26 15:12:00]

网友:参与开源项目在中国已经成为一个热潮,但是还处在起步阶段,有一定的盲目性,很多开源项目也因此夭折,能不能给大家一个更好的建议,如何实施开源项目?
[2005-9-26 15:13:00]

Nat Friedman:实际上这不仅是软件开发的问题,很多时候人们说做这件事情,但是没有切实实行它。对于参加开源软件来说可以从最基础的做起,可以从很多方面,包括可以帮助创建很多项目的网页、软件列表,帮助做代码的分支管理,诸如此类的事情都是可以的。
[2005-9-26 15:14:00]

Nat Friedman:另一方面可能因为一些个人的需要去开发软件,也可能是对软件的需要,目前的软件可能没有适合你的,你可能自己写一个,重要的是你写目前软件的时候遇到了一个问题,你就可能解决这个问题,你是否把源代码的软件下载过来,你是否去编译的时候可能遇到各种各样的问题,你可能询问很多人,最后搞定如何编译,这样你可以找出之前发现的问题所在的地方,这时候读代码的训练就显得非常重要,这样可以更快让你找到整个程序的架构,并可以找到隐藏在哪儿,这样你可以为程序写一个小补丁,不定可能很简单也可能很复杂,比如为了提高性能可能需要把某些数据结构调整一下或有关算法,不管怎么样通过这样的方式来参与一个开源的项目。
[2005-9-26 15:16:00]

Nat Friedman: 当你在自己的系统上可以把应用的补丁运行起来以后,还可以进一步考虑,因为你发现这个问题可能别人已经发现了,可以考虑把你修补的地方写成补丁,发给维护应用的那个人,或者是正在写应用的那个人,他可能会给你比较积极的回复,比如他愿意把这个补丁收入他的应用,也有可能他不愿意或者希望你对补丁做进一步的修改,或者使用这种方式再重写这个补丁,诸如此类的事情,你或者是按照作者的要求来做的或者是你放弃了,这都不管紧要,做开源工作重要的工作是第一点是下载源代码,第二是用编辑器打开代码并且读这些代码,很多人在论坛里面发一些帖子,发表很多言论,这对开源编码是没有作用的,最重要的就是下载、编译、修改。
[2005-9-26 15:21:00]

Nat Friedman: 作为一个成功的Linux黑客的话,至少得有这样几种品质,首先必须要聪明,能够有一些有创意的想法或者能够很快的领会别人的意思。其次,他必须有一些品味,不然的话做出的应用只有他自己喜欢使用,但是最重要的一点就是坚持,如果没有坚持的话,前面两点都没有什么用处,一开始做一个应用的时候可能遇到很多挫折,包括开发,包括说服别人接受它,包括推广的时候只有坚持下来才能把项目做起来,所以坚持是这三点中最重要的一点。
[2005-9-26 15:22:00]

Nat Friedman:再举一个例子,在Linux下面以前有一个很流行的方法,其实现在还比较流行。某位开源技术大师是非常聪明的人,但是他的程序代码就不是非常好,他用了一些并不是很受其他程序员欢迎的技术,他不主动释放管理器占用的内存,但是他依然非常坚持,他非常花时间研究这些代码,但是缺乏非常好的通用性,所以项目并不能算非常成功。
[2005-9-26 15:27:00]

网友:目前桌面搜索是非常热的话题,Beagle项目在2002年就进行了这方面的开发,请讲一下目前这方面的?
[2005-9-26 15:28:00]

Nat Friedman: Nat Friedman:Beagle是一个桌面搜索的工具,就在大概一个半星期之前,刚刚发布了Beagle的0.1版本,虽然这个版本号很少,但是因为开源软件和软件采取的版本号命名方式不一样。 对Beagle的版本号命名方式是从0.1开始然后往上涨,实际上0.1版本已经做了一年多的时间了,如果你用“SUSE Mono 10”的话它里面已经继承了Beagle的工具,所以它现在可以索引,包括的邮件、媒体邮件、MP3可以搜索更多的文档,包括更多的文本、网页或者word文档或者PDF或者是其他文档。现在在Beagle上的重点工作是做一个更好的用户界面,这几天正在IRC频道正在讨论这件事儿,正在着力解决这方面的问题,如果你留意的话在网上会看到一些新的Beagle的用户界面,非常漂亮。
[2005-9-26 15:30:00]

网友:现在很多中国政府正在大力推动使用Linux,请问一下Novell公司将会为中国的政府部门提供一个什么样的Linux的解决方案。
[2005-9-26 15:31:00]

Nat Friedman:我们在明年的时候会有一个针对桌面的产品叫做NLD10,这个是到时候最好的Linux的作品,其中包括各种各样对系统的增强,还包括各种各样的应用基于Novell或者企业里面应用比较广泛的,NLD10会有非常本地化的工作,并不是一个针对政府的产品,是一个针对所有桌面Linux用户的一个产品。
[2005-9-26 15:33:00]

网友:Mono现在相当于.net的框架,是不是打算也开发出一个增强框架增强它的能力。
[2005-9-26 15:38:00]

Nat Friedman:现在在开发工具上,一方面在做工作,是给ECLIPSCE,现在主要是用来做Java的IDE环境,我们通过给ECLIPSCE开发插件,支持Mono这是一方面的工作。另一方面有一个基于JJK下的开发工具,里面包括Mono的调试器,图形界面的设计环境都有,这是我们在这方面做的工作。我自己是使用EMAC。
[2005-9-26 15:39:00]

网友:现在很多人采用了Linux平台以后都发生了知识产权纠纷,在Mono这个版本上会不会解决这个问题?
[2005-9-26 15:39:00]

Nat Friedman:从美国的《知识产权法》来说,我相信世界各地也不会差得太多,说知识产权实际上有四个方面的内容,第一个方面是版权,第二个方面是专利,第三个方面是商标,第四个方面是商业机密。所有开源的代码主要是针对版权这一个方面,所以设开源的软件也一样会有其他的知识产权的问题。
[2005-9-26 15:40:00]

Nat Friedman:在这样的基础上,实际上是一个开源软件接受外援代码的时候可能有潜在的风险,包括贡献代码的人本身可能并不拥有那个代码,他本身没有一角那部分代码的版权,因此不管是Novell或者是开放源代码基金会这样的组织,在你向他们贡献源代码的时候都要求你签一份协议,声明你本人是这部分代码的原作者,并且把这部分代码移交给开发源代码基金会或者什么机构,并且让他们使用。 从Novell来说,其中最核心的部分会要求所有参加开发的人员都来签这样一份协议,而且所有补丁都必须通过相应的代码维护人,代码维护人会维护相应的版权问题。所以Mono的核心部分我们是非常注意的,但是它的外围就非常多了,所以在这方面没有做太多的工作。
[2005-9-26 15:42:00]

Nat Friedman:以我本人的经验来说,我曾经在微软工作过,我又和伙伴一起创建了一个做开源软件的公司,所以根据我自己的了解和观察,实际上参与开源的程序员比只开发专有程序员对授权知识产权更敏感,开发专用程序员在网上看到一个授权下载就使用。
[2005-9-26 15:45:00]

Nat Friedman:从专利的角度来说,专利设计的问题很多,实际上有各种各样的软件专利,并且专利一旦被批准以后会成为让对手非常难受的东西。 比如说你已经写了数万行或者数十万行的软件代码,可能有人认为其中侵犯了他的某一项专利是很难处理的事情。我们Mono是基于开放标准的,因为微软已经把标准提交给了委员会。 另一方面作为.net框架本身没有什么开创性的东西,我们认为所有在.net里面能够看到的特性在之前我们都见到过,所以它也不会有专利。我们知道Java框架是有专利的,所以以后开发中如果认为在.net里面有一些专利,认为我们应该遵守的话,我们会考虑做工作绕开它,一方面是利用其他方式实现,最坏的情况是我们可能取消某些东西。
[2005-9-26 15:47:00]

网友:大部分人使用Linux的时候都觉得它的界面不是很好,请问SUSE Linux 10中会不会有非常酷的表现呢?
[2005-9-26 15:48:00]

Nat Friedman:在SuSE Mono 10里面有非常多的酷的特性,包括现在的Windows系统都没有的一些特性,你利用这样的桌面会让很多伙伴非常羡慕。
[2005-9-26 15:50:00]

网友:微软即将发布C#3.0的标准,Mono有没有跟进的计划,是不是打算自己开发出一套语言出来?
[2005-9-26 15:51:00]

Nat Friedman:我参加了今年微软的PEC的大会,感觉C#3.0的特性挺不错,我们会尽可能早地实现但是不是现在,因为现在实现3.0的特性没有用户用它。我们现在某种程度上已经支持了C#2.8,我们尽可能把这个工作和支持性做好,之后再做C#3.0的工作。
[2005-9-26 15:52:00]

网友:现在在开源平台LAMT做一个大家非常喜欢的架构,还有人会选择Java+Linux,还有人会选择Mono+Linux,请问这几种选择的适用范围是什么?
[2005-9-26 15:52:00]

Nat Friedman:用什么样的技术取决于要解决什么样的问题,所以到底采用哪种还是要看情况。对于及时或者很快做成的解决方案肯定用LAMP是比较好的方法。 如果是开发企业应用的话可能会采用Java或者是Asp.net,如果使用Asp.net一般是不愿意花太多时间来开发的程序员,他可以利用“Visual Basic.Net”的方法进行应用开发。不管是Java还是Asp.net都是非常严谨的,它的语言都是分门别类做的非常仔细,但是你用脚本语言可能都没有那么细,因此不管是Java还是Asp.net都不适合于做要非常快要结果的东西,但是它们比较适合于做比较严谨或者周期比较长的项目。
[2005-9-26 15:58:00]

Nat Friedman: 一定要选择的话比较简单的做法就是看你周围的程序员在使用什么样的技术,如果你接受了微软的培训,你也在使用Asp.net,那么你可以考虑使用Mono,这是一样的。
[2005-9-26 15:58:00]

网友:在Linux华丽的界面并不是目的,性能才是最重要的,在WindowsXP下同时打开数据窗口非常快,请问在Linux下的如果打开同样的窗口是不是能保持很好的性能?
[2005-9-26 15:59:00]

Nat Friedman:开窗口取决于你开什么样的应用,比如Windows下了开了15个终端口,实际上一共就会占用20兆左右的内存,你开了第一个以后开第二个实际上净量内存是非常非常少了,而且Linux对内存的管理非常智能,实际上你开那么多的窗口根本没有什么影响,或者说你在Windows开多少窗口在Linux上也可以同样开多少窗口。这说明Linux性能是让人放心的。
[2005-9-26 16:01:00]

网友:目前国内的开发者学习新的开发技术最大的障碍是语言,Mono有没有打算出一些面对中国用户的中文主页或者中文的帮助文档,或者说有没有这样的计划?
[2005-9-26 16:02:00]

Nat Friedman:实际上Mono本身带了一个叫做“MonoDoc”的工具,现在你看的时候会显示一个按纽,比如某一个文档正在补全,你可能发现一个问题,可以直接点编辑按纽对那部分文档进行编辑,比如可以添加一些新的识别代码,你做完以后会有一个按纽可以直接提交,这样你修改或者添加的东西可以提交给一些文档的维护人员。文档的维护人员会有时间看你发过来的东西,可能某些集成以后再修改。 现在没有特别的计划要针对中文做一些工作,但是我们可以考虑在MonoDoc工具上添加一个按纽,可以让人在上面直接提供相关的包括翻译的东西,如果有谁感兴趣可以考虑做这样的工作,就是给MonoDoc添加一个翻译的功能。
[2005-9-26 16:07:00]

网友:Mono这个项目是在一个什么样的背景下产生的,如果我想加入Mono项目需要做一些什么样的事情?
[2005-9-26 16:07:00]

Nat Friedman:Mono是2001的时候开始创立的,那个时候理查德是这个项目的领导人,我主要是利用Mono开发一些桌面应用的组建,现在整个项目已经非常稳定,有超过350多个非常活跃的开发人员已经是非常大的项目了。 如果想对Mono项目有所贡献的话,只要到Mono.net上面看一眼就有一些比较有意思的工作可以做,因为Mono本身的结构非常好,所以你非常着手对其中做一些贡献,包括开发一些新的外围的软件包这些东西。
[2005-9-26 16:08:00]

网友:你当初和理查德一起开发这个项目的时候,是出于什么原因选择跟他一起做这个项目?
[2005-9-26 16:08:00]

Nat Friedman:我开始玩儿Linux大概是16岁的时候,最初我们是在RIC的聊天室里认识的,在大学的时候学校里面有一个VIC服务器,那个上面有很多在Linux非常活跃的人,有一天理查德在上面出现了,他是墨西哥人,可能英语不是很好,可能上来是学英语的,他比较有趣,后来我们俩个就认识了。他曾经在微软做过实习,有一天理查德来面试,两个人那天遇到了,聊的很开心,我们在一起做自己的事业的主要原因是因为他这个人非常有活力。
[2005-9-26 16:12:00]

Nat Friedman:一开始的时候并没有打算自己做一个公司,当时是想买一个房子,里面可以安排很多喜欢做软件的黑客,我们两个可以让他们在里面开开心心的写代码,所以开始的时候是找其他公司,希望他们愿意做这样的事情,但是没有公司愿意做这样的事情,最后只有我们自己开了这样一家公司。
[2005-9-26 16:13:00]

网友:Mono项目成立了时候主要目标是什么?现在是否实现了目标或者离目标还有多远?
[2005-9-26 16:13:00]

Nat Friedman:实际上创建Mono项目主要有两个目标一个是让Linux开发项目的开发人员开发更有效率,另一方面是吸引一些Windows程序员过来尝试在Linux环境下进行开发。现在已经做到了一些,但是还是有一些差距。
[2005-9-26 16:14:00]

Nat Friedman:实际上创建Mono项目主要有两个目标一个是让Linux开发项目的开发人员开发更有效率,另一方面是吸引一些Windows程序员过来尝试在Linux环境下进行开发。现在已经做到了一些,但是还是有一些差距。
[2005-9-26 16:15:00]

主持人:最后,按照CSDN聊天室的惯例,请Nat Friedman先生送给广大中国网友一句祝福的话。
[2005-9-26 16:16:00]

Nat Friedman:希望中国的程序员能够积极性参与到开源社区的构建活动当中。因为现在的开源社区在全球都有,我们不希望看到在中国有一个自己的开源社区,在美国有一个、印度有一个、欧洲有一个,所以希望大家在一起合作,尽可能的把所有的开源社区的人融入到一起,形成一个全球化的开源社区。
[2005-9-26 16:16:00]

主持人:本次聊天活动已经结束,让我们再次感谢Nat Friedman先生的光临。再见!

对不知道的人来说,开放源代码Mono项目(将.Net转向Linux)后面的基本理念有些难于抓住,微软的.Net开发平台的所有含义就是要让Windows程序员工作更加便利,这样一个东西如何被用来编写Linux应用,因为Linux是微软讨厌的东西。

  在三年的辛苦工作以后,Lcaza作为Mono项目的发起人,已经设法将一些微软的印记带给了Linux阵营。在去年收购了Ximian公司之后,现在Novell已经接管了Mono的工作。对开放源代码的狂热追求者而言,Mono已经不再只是惊奇,它具有更多的潜力。

  Mono不是一个开发工具,比如微软的VisualStudio,它是构成微软开发工具的端口和入门。这些开发工具包括微软的C#开发语言、预写代码库和微软运行时间通用语言,其功能是允许程序员整合一个单一应用程序中用不同语言编写的代码。

  在公司销售Mono1.0版不久之前,Lcaza对媒体谈论了他的看法,以下是采访摘要

  问:既然Mono1.0版已经完成,你是否能够做你以前不能做的事情?

  答:Unix对程序员来说是一个痛苦世界。基本上我们得到了非常现代的用于其他平台开发软件的集成开发环境(IDEs)。

  例如在Novell,这个选择我真的没有涉足,但是它们研究了Mono技术,并且发现了所需要执行这个东西准确含义,就是iFolder3.0,这个新版本具有许多新特点,就像长角牛的WinFS可以对数据、备份资料和所有有趣的东西进行同步。当Novell收购了Ximian之后,他们就选择了在Windows和Linux上运行同一软件的计划。

  所以今天他们用同样的工具基础支持Windows、Linux和MacOS等不同的操作系统。它有助于让开发商更集中于自己所做的工作,而不是关注特殊平台的繁杂事项。Mono具有许多新的开发特点,我们的中心思想是,Mono是我们内部的开发平台。

  问:在Mono成为技术标准,微软已向欧洲计算机制造商协会提交标准的情况下,你将如何与微软保持一致,微软将做些什么?

  答:Mono1.0在今年中期刚刚推出,我们在三年前开始的项目。微软在一年半之前就发布了它们的产品。所以我们很晚,非常的晚,比微软晚了18个月。但是我们仍然在销售,人们也正在用它。

  总之,就向AlanCo所说的那样:自由软件总是迟到。从编写第一行代码开始,你就在编写因为你需要的东西。所以总是把事情向后推,自由软件总是如此。

  我们已经在协调.Net2.0的功能。Mono1.0版已经这样做了—通过整合完成此项任务。我们的团队已经在开发2.0版的功能。例如,我们一直在开发微软C#2.0标准。(完

M$ 在排挤了 Java 数年之后,有公司发展出一套新的工具,这套工具
可以让 .Net 的东西转换到到 Java 中。Halcyon Software 公布了第一个
Instant .Net (简称iNet) 的测试版本,这个东西是 M$ 的Visual Studio .Net 开发工具的一个嵌入程序,这个程序可以将以XML 为基础的 .Net Web Services 转成 Java 语言,并且让任何支持 Java 的应用程序服务器执行。一般企业的开发者,可以利用 Web Services 让从不同的提供厂商所提供的应用程序透过 Internet 互相沟通。例如,在 Oracle 公司内的资料,可以被 PeopleSoft 公司的 CRM 软件分享使用。

电子钱包也是另外一个 Web Services 的应用,它允许使用者在线上购买的
时候,不用敲入信用卡号码或是其它的信息。

我们可以利用不同的厂商所提供的工具来发展 Web services ,而这些web services则可以透过网络让任何执行不同操作系统的周边装置存取时, M$ 却把 .Net Web Services 锁定在他自己的平台 .Net server software 上。这个软件包含了一个执行环境,当然这个执行环境只能在M$ 的软件上执行。不过这家公司已经将部分的执行环境提交给 European Computer Manufacturers Association(ECMA) ,这是一个工业标准组织。像是 Halcyon 的执行长说的,iNet 的一个
好处是可以让那些以 J2EE 与Windows 软件为基础的公司,可以继续开发 M$ 的程序代码,但是将他们的结果放在支持 Java 的服务器上执行,这些服务器提供商包括了 M$ 的对手,像是 BEA, Sun, IBM …Linux 以及 Mac OS X 操作系统均支持 Java ,因此也可以透过 iNet 来具备执行.Net Web services 的能力。这将会让这些选择使用 .Net来开发 Web services 的公司们,有更多的选择机会。

他同时也提到,有些争论说 M$ 也许不是个部署应用程序的好地方,也许选择 Linux box 或是 Solaris box 是更好的选择,而 iNet 让这些 .Net Web Services 的开发者可以将他们的程序部署在其它的平台上。不过 M$ .Net 工具的一位发言人婉拒了对 Halcyon 的技术下评论。Microsoft 也许会对 iNet 保持沉默,因为这个软件并不会使用 Java语言来取代掉他们的技术。

Java 是由 Sun 所发展的,并且成为 M$ 本身的程序技术的一个重要的竞争对手。M$将 Java 从 Windows XP 这个操作系统中移除,之后两家公司便不断在要吸引使用者来使用他们个别的程序语言。Hsi 指出, M$ 说过他们希望 .Net 可以在其它的操作系统上执行,但是他认为 M$很难忍受大家已经将 Java 运用得很成熟了。.Net Web Service 只可以在 M$ 的服务器上执行,因为他使用了一个叫做 CLI(Common Language Infrastructure) 的技术, CLI 是一个让 .NET
Web Service 执行的一个的一个核心技术。他与 JVM (Java Virtual Machine) 很相似,Java 可以被放在 client 上,并且执行 Java Application ,而 CLI 则像是 .Net 应用程序的引擎般。.Net 架构是 CLI 的商业化的实做结果,他包含了一些额外的特色,像是 class ibraries ,以及 client 端的使用者接口。

在经过约一年的测试之后, .Net 架构已经在 2/13 号公布了最后的版本。 人们希望M$ 公布它围绕着 .Net 架构设计的 Windows .Net Server ,接下来的五个月,会公布一个手持装置的执行环境的计划,而更小的运算装置也会在以后公布。Halcyon 的 iNet 工具可以替代 CLI ,这家公司使用自己的技术发展了一个执行环境,而这个执行环境可以让 .Net Web Service在 JVM 上执行。

Hsi 说,我们想要跳过整个 CLI 。

他们的作法是,程序开发者使用了 Visual Studio .Net 建立了一个.Net Web Service ,同时将他编译成一种叫做 MSIL (Microsoft Intermediate Language)。接着开发者使用 Halcyon 的 IL-to-Java (Intermediate Language-to-Java) 工具,这个工具最后可以将原来的 MSIL 转换成 Java byte code ,然后利用 Halcyon 工具包装成一个档案,接着这个档案就可以在 JVM 上面执行了。Yefim Natis 说: Halcyon 的计划有它的优点,然而当 M$ 持续的公布新的特色,以及更新 .Net 的架构之后,他们也许不会再继续维持下去。

Natis 也说,他很怀疑这会成功,以表面上来看,它非常的吸引人,因为他可以使用很棒的开发环境,像是 Visual Studio .Net ,然后却不被 M$ 的软件所局限住。由于 .Net 的架构下,包含了比JVM更多的特色,像是vital class ibraries ,以及用来显式 .Net Web Services 的使用者接口, Halcyon 必须开发额外的东西来补足这些差异。譬如,一家公司设计了Java 版本的 M$ Windows 窗体,他允许使用者建立client-side 的使用者接口(M$ ASP .Net) ,这个接口允许这个 application 被显示在 web site 上。

Natis 指出,他不会是 .Net 的真实行为以及功能面的复制,因为每次当 M$修改或是公布新的 service pack , Halcyon 将需要快速的实做这些新的特色,也就是说他总是 M$ 的表兄弟般,而且可能会缺少一些 .Net 的特色。Hsi则指出 Hylcyon 可以为 Java 重建整个 .Net 架构,不管 M$ 怎么修改这项技术,他有 90 个开发者在持续的维护他们的技术,而这项计划在 2000 年十月时就开始了这个计划。

Halcyon 也已经开发了一个产品叫做 Instant ASP (iASP),这是个Java 版本的Microsoft ASP (Active Server Pages) 技术。像是 HP 这些公司,都已经取得 iASP的授权, Hsi 说它的公司已经被证明他们具有将 M$ 的程序代码转换成 Java 的技术能力了。

当然也有其它人致力于将 .Net Web Services 带到其它非 Windows 的环境中,他们使用的是 ECMA 的标准, Ximian 公司就带了一个计划叫做 Mono ,他们正努力将 CLI移植到 Linux 以及 Unix 操作系统上。这个计画如果实现,将可以让程序开发者使用Linux Programming工具来开发.Net Web Services。

由 Corel 取得的技术支持, M$ 也开发了一个 FreeBSD 版的 CLI 。M$ 说,这个计划的目的在于证明 .Net 的一部份架构可以在开放式的标准下被复制出来。这个计划很像是 Mono ,但是他受到 M$ 的 shared source 版权的保护,也就是说这个程序代码只能以研究的目的存在,而不能被企业所商业化。

iNet 及 Halcyon 的 Java 执行环境可以免费下载,网址位于
http://www.halcyonsoft.com

主要是增加了对.Net 2.0新特性的支持,MONO C#编译器已经实现的有:

范型(Generics)、匿名方法(anonymouse methods)、迭代器(iterators)、静态类(static classes)、局部类(partial classes)、内联警告?(inline warning)

暂时还没有被实现的有:

nullable types, namespace alias qualifier, external assembly alias, property accessor accessibility, covariance and contravariance, fixed size buffers and friend assemblies

其它的无非就是修改了BUG和提高了性能,值得一提的是Asp.Net的性能比上一个版本提高了8倍,并且稳定性也大大的提高了。

Mono已经有商业应用的案例,是不是linux下.net时代的开始了…

该案例来自Novell的资料, 为德国柏林一家公司部署的运行在Suse系统下的学籍管理软件.

不过还记得在Mono 处于beta的时候,有一家数据库软件公司, 是用Mono实现了

数据库内.net 的存储过程语言!!   :) )好像也是德国公司! 佩服

V&ouml;lcker Informatik AG,一家柏林的IT服务公司在MONO平台上成功的应用了一套基于.Net技术的解决方案。在柏林市的教育网络使用超过350台的SUSE LINUX服务器和40000台PC为150000学生提供了学籍管理服务。
使用MONO作为开发平台代替JAVA,V&ouml;lcker打开了一个新的市场,并且减少了公司60%的测试时间,而不需要再雇佣5-10个新程序员。

By using Mono to port its software to Linux, V&ouml;lcker has opened a new market to serve customers running both Windows and Linux platforms. Using Mono as its development platform, instead of Java, has reduced the company’s testing time by 60 percent and eliminated the need to hire 5-10 new programmers. Migrating to Linux is also paying off for its customers who are gaining all the benefits of an open source network, as well as an enormous reduction in server licensing costs.

这个是Novell公司的一篇带有广告性质的成功案例,但是我们从中看到了MONO正式在大型企业商业化的开发中占有了一席之地。

记得MONO刚出来的时候,有很多人对它充满了FUD。一时间,“MONO其实是水中月”、“MONO注定不能进行商业化开发”、“没有大型企业敢采用MONO”等言调到处可见,并且还长篇大论从市场经济技术等各个角度来证明论点。

当有人企图用一百万字的论文来证明世界上不存在黑天鹅的时候,MONO开发小组什么也没有说,只是放了一只黑天鹅在他面前