2004年04月30日

异常处理应用程序块包含了优化异常处理的代码。你可以在这里下载它。它被封装在Microsoft.ApplicationBlocks.ExceptionManagement命名空间里。要使用它,你就必须把一个参照添加到Microsoft.ApplicationBlocks.ExceptionManagement.dll里。


异常处理应用程序块提供了管理你应用程序异常的一种方法。这个构件块的主类是ExceptionManagerBaseApplicationExceptionExceptionManagementSectionHandler类。这个层里的类的细节视图如C


图C



异常处理块


应用程序异常由BaseApplicationException类捕捉。ExceptionManager是关键类。ExceptionManager类的Publish方法被用来处理异常。这个发布机制由一个XML的配置文件来设置。在内部,ExceptionManager使用ExceptionManagementSectionHandler类从XML的配置文件取回发布器的设置。缺省的发布器会在EventLog里记录Exception的细节。你也可以通过添加自定义的发布器来扩展这个构建块。







 


<br /> <a href="http://ad.cn.doubleclick.net/click%3Bh=v2|30fd|3|0|%2a|v%3B4080296%3B0-0%3B0%3B6694713%3B31-1|1%3B2500994|2499196|1%3B%3B%3fhttp%3a%2f%2fwww.site.com" target="_blank"><IMG SRC="http://m2.cn.doubleclick.net/649284/net_MPU.gif" WIDTH=468 HEIGHT=60 BORDER=0 ></a><br />


唯一的要求是这些自定义的发布器应该能够实现IexceptionPublisher或者IexceptionXmlPublisher接口。你可以更改发布异常的方式。它可以是写入到文件、发送电子邮件通知,或者是把错误记录在数据库表格里。你所要做的是把这个算法封装起来,在发布器里实现——这个发布器会实现各个接口中的一个——并设置配置文件来使用这个发布器。ExceptionManagerCustomPublisher来发布异常。

这个配置文件可以是下面三者之一:



  • Machine.config(用于所有的应用程序)
  • Web.Config(用于所有的Web应用程序)
  • ApplicationName.Exe.Config(用于Windows的应用程序)

下面是用于配置自定义发布器的一个示例XML片段:


configuration>
configSections>
section name=”exceptionManagement”
type=”Microsoft.ApplicationBlocks.ExceptionManagement
.ExceptionManagerSectionHandler,
Microsoft.ApplicationBlocks.ExceptionManagement”/>
/configSections>
exceptionManagement>
publisher mode=”on” assembly=”CustomPublisher”
type=”CustomPublisher.ExceptionPublisher”
DB=”Data Source=(local);User Id=sa; Password=;Initial Catalog=MyApp” />
/exceptionManagement>
/configuration>


为了防止CustomPublisher不可用,应用程序块使用了缺省的发布器。VB.NET的示例代码如下,它说明了异常是如何在代码里被发布的:


Try
objConn.ConnectionString = “Data Source=(local);
User Id=sa;Password=;Initital Catalog=SouthWind”
objConn.Open()
Catch objSqlEx As SqlClient.SqlException
ExceptionManager.Publish(objSqlEx)
Catch objEx As Exception
ExceptionManager.Publish(objEx)
Finally
objConn = Nothing
End Try


以上代码所捕捉的异常由ExceptionManager来发布。

2004年04月28日

       现在从对ASP.NET页面的执行顺序开始,体会一下B/S结构的程序的特点,下图是ASP.NET页面的执行顺序说明:

  Page_Init(页面初始化引发的事件)——>Page_Load(加载页面时引发的事件)——>Control   Event(服务器控件引发的事件)——>Page_UnLoad(页面从内存中卸载时引发的事件)

  Page_Init和Page_UnLoad不常用,但是这里还是要说明一下。Page_Init和Page_Load事件区别在于,只有后者才能完全加载控件,绑定数据,虽然你可以在Page_Init中访问控件,但是其viewstate都不会被加载,所以此时控件中只拥有默认值。
  这里说到了viewstate,我们先来做一个大致的了解——其实在ASP.NET中有两个viewstate。一个是控件本身的,用来维护控件自己的一些状态,比如说某个空间有变色的功能,它的viewstate就维护这个功能,这个viewstate是不能被用户访问的。相信自己写过控件的朋友都会有这样的感觉,自己写控件当然也要用自己的一个viewstate来维护这个控件的状态;而另外一个viewstate,是用户使用的,这个viewstate和Session几乎一模一样,必须要先对其进行定义,才能使用。

  每当点击ASP.NET的Web网页上的Button、LinkButton或ImageButton等控件时,表单就会被发送到服务器上。如果某些控件的AutoPostBack属性被设置为true,那么当该控件的状态被改变后,也会使表单会发送回服务器。?(AutoPostBack属性,它只有两个bool值,true/false。如果这个属性被设置成false,那么点击后就不会立刻将变化传给服务器处理,也就不会有该控件的SelectedIndexChanged事件。)
  每次当表单被发送回服务器,就会被重新加载,启动Page_Load事件,执行Page_Load事件处理程序中的所有代码(注意,是每次都会执行!)。
很显然把网页的初始化代码放在这里是最合适不过。我们经常会希望在每次加载网页时执行一些代码,如一些控件的数据绑定。

 当我们希望只有在网页第一次加载时执行另一些代码(基本上都是数据的默认绑定),甚至希望一些代码在除首次加载外的每次加载时执行。那么我们可以利用IsPostBack特性来完成这一功能。在网页第一次加载时,该属性的值是false。如果网页因回送而被重新加载,IsPostBack属性的值就会被设置为true。


在ASP.NET应用程序中,如果需要在页面第一次显示时执行一些初始化操作,必须判断IsPostBack属性!

  在ASP.NET使用Page.IsPostback,那么就可以避免往返行程上的额外工作:如果处理服务器控件回发,通常需要在第一次请求页时执行代码,该代码不同于激发事件时用于往返行程的代码。如果检查?Page.IsPostBack?属性,则代码可按条件执行,具体取决于是否有对页的初始请求或对服务器控件事件的响应。这样做似乎很明显,但实际上可以忽略此项检查而不更改页的行为。该属性用的好坏,直接关系到你程序运行是否按照你最初的意愿,也关系到整个页面的效率。因为,如果每次都会给控件绑定数据,不管你是第一次访问,还是提交了数据以后,那么这个页面程序的效率可想而知。


一个B/S结构的页面每一次提交,它都会重新从头到尾执行一次。而C/S结构的程序就不会这样,这是和C/S结构的程序最大的区别!? 其实,得不到控件的数据,都是因为这个原因。

2004年04月27日

Pick up three quick techniques to fire up server controls from the client side.



Looking to hook client events to server controls? Well, you can take a variety of approaches. The easiest is when the control doesn’t have a server event with the same name. All you need to do is put the client event on the tag:


<asp:Image onMouseOver=”alert(‘Mouse Over’)” … />” 


For objects, as a button, you can hook them to client events by adding attributes from your server-side code. This is some basic code you might add in your page load event: 


Button1.Attributes.Add(“onclick”, “alert(‘Clicked’);”) 


If you need to hook up to the form submission, or in the event of validation cases, you can use the RegisterOnSubmitStatement in your server-side code. The following page load code snippet causes any control on the page to display a JavaScript alert box before a submission or postback: 


RegisterOnSubmitStatement(“uniqueKey”, “alert(‘Submit!’);”) 


You can use any one of these strategies to call more advanced JavaScript. Using the approach that fits your needs lets you perform more logic on the client side and reduce the overhead of postbacks in ASP.NET.


Simple & Funny——用正则表达式处理html文档

2004年04月26日

ASP.NET下面主界面的框架,现在了解下来有这么几种方法:
1.一种是用FrameSet(框架)的方法,

2.ASP.NET Starter Kit中的方法是动态装入用户控件。

3.ASP.NET2.0的方法是Master Pages
http://www.developer.com/net/article.php/3099171


http://blog.joycode.com/mmkk/posts/4619.aspx
 在ASP.NET1.1中有一个类似的方案:
http://www.cnblogs.com/dudu/articles/1503.aspx
http://www.asp.net/ControlGallery/ControlDetail.aspx?Control=385&tabindex=2

2004年04月25日

OpenFlow? ?http://www.czug.org/docs/workflow/

??????????????????? http://www.openflow.it/EN/index_html

工作流管理 http://www.iturls.com/TechHotspot/TH_h.asp

基于Web的工作流管理系统的设计与实现http://www.e-works.net.cn/ewkArticles/Category175/Article14084.htm

工作流技术:http://www.softat.org/ShowSpecial.asp?SpecialID=1

中国工作流论坛?? http://www.wf800.com/

BPEL? Resource?http://www.bpelsource.com/index.html

http://blog.csdn.net/hongbo781202/category/24820.aspx

在ASP.NET应用中,Web表单之间的导航有多种方式:用超级链接,用Response.Redirect,用Server.Transfer,或者用Server.Execute。本文将分析这四种导航方式的异同及其优缺点,帮助你选择最佳的导航方式。  

一、超级链接  

  从一个表单进入另一个表单最简单的方式是使用HTML超级链接控件。在Web表单中,使用超级链接的HTML代码类如:  

进入表单2  

  当用户点击该超级链接,WebForm2.aspx执行并将结果发送到浏览器。超级链接导航方式几乎可用于任何地方,包括HTML页面和普通的ASP页面。ASP.NET还提供了另一种可替换使用的方法,即HyperLink服务器控件:  


  
        NavigateUrl=”WebForm2.aspx”>进入表单2  

   


  上述HTML代码的运行结果和第一个例子相同,因为ASP.NET把HyperLink Web服务器控件视为一个HTML超级链接控件。但两者有一点重要的区别,HyperLink Web服务器控件可以在服务器端编程。具体地说,可以在程序代码中改变它的NavigateUrl属性,从而允许构造出具体目标可根据应用的当前状态动态变化的超级链接,例如:  

Private Sub Button1_Click( _  
ByVal sender As System.Object, _  
ByVal e As System.EventArgs) _  
Handles Button1.Click  
    HyperLink1.NavigateUrl = “WebForm3.aspx”  
End Sub  
  



  这段代码执行后,如果用户点击链接,他看到的将是WebForm3.aspx,而不是WebForm2.aspx。  

二、用程序控制重定向  

  虽然超级链接能够从一个页面导航到另一个页面,但这种导航方式是完全由用户控制的。有些时候,我们可能要用代码来控制整个导航过程,包括何时转到另一个页面。在这些场合,ASP.NET有三种不同的方式可以达到相似的目的:调用Response对象的Redirect方法,调用Server对象的Transfer或Execute方法。这三种导航方式的行为基本相似,但也有区别。  

  2.1 Response.Redirect  

  Response.Redirect方法导致浏览器链接到一个指定的URL。当Response.Redirect()方法被调用时,它会创建一个应答,应答头中指出了状态代码302(表示目标已经改变)以及新的目标URL。浏览器从服务器收到该应答,利用应答头中的信息发出一个对新URL的请求。  

  这就是说,使用Response.Redirect方法时重定向操作发生在客户端,总共涉及到两次与服务器的通信(两个来回):第一次是对原始页面的请求,得到一个302应答,第二次是请求302应答中声明的新页面,得到重定向之后的页面。  

  2.2 Server.Transfer  

  Server.Transfer方法把执行流程从当前的ASPX文件转到同一服务器上的另一个ASPX页面。调用Server.Transfer时,当前的ASPX页面终止执行,执行流程转入另一个ASPX页面,但新的ASPX页面仍使用前一ASPX页面创建的应答流。  

  如果用Server.Transfer方法实现页面之间的导航,浏览器中的URL不会改变,因为重定向完全在服务器端进行,浏览器根本不知道服务器已经执行了一次页面变换。  

  默认情况下,Server.Transfer方法不会把表单数据或查询字符串从一个页面传递到另一个页面,但只要把该方法的第二个参数设置成True,就可以保留第一个页面的表单数据和查询字符串。  

  同时,使用Server.Transfer时应注意一点:目标页面将使用原始页面创建的应答流,这导致ASP.NET的机器验证检查(Machine Authentication Check,MAC)认为新页面的ViewState已被篡改。因此,如果要保留原始页面的表单数据和查询字符串集合,必须把目标页面Page指令的EnableViewStateMac属性设置成False。  

  2.3 Server.Execute  

  Server.Execute方法允许当前的ASPX页面执行一个同一Web服务器上的指定ASPX页面,当指定的ASPX页面执行完毕,控制流程重新返回原页面发出Server.Execute调用的位置。  

  这种页面导航方式类似于针对ASPX页面的一次函数调用,被调用的页面能够访问发出调用页面的表单数据和查询字符串集合,所以要把被调用页面Page指令的EnableViewStateMac属性设置成False。  

  默认情况下,被调用页面的输出追加到当前应答流。但是,Server.Execute方法有一个重载的方法,允许通过一个TextWriter对象(或者它的子对象,例如StringWriter对象)获取被调用页面的输出,而不是直接追加到输出流,这样,在原始页面中可以方便地调整被调用页面输出结果的位置。  

  为说明其工作过程,下面我们创建一个Web表单,放入一个按钮控件(Button1)和一个文本控件(Literal1),在设计界面中转入代码视图,加入一个System.IO名称空间的Imports语句,然后加入用户点击按钮时执行的代码:  

Private Sub Button1_Click( _  
ByVal sender As System.Object, _  
ByVal e As System.EventArgs) _  
Handles Button1.Click  
    Dim sw As StringWriter = New StringWriter()  
    Server.Execute(“WebForm2.aspx”, sw)  
    Literal1.Text = sw.ToString()  
End Sub  
  



  然后为同一个Web应用创建第二个页面WebForm2.aspx。转入该页面的HTML视图,修改其Page指令禁止ViewState检查:  

<%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm2.aspx.vb"  
  Inherits=”Navigate.WebForm2″ EnableViewStateMac=”false”%>  
  



  再转到设计视图,为第二个页面增加一些控件。接下来,把第一个页面设置成默认页面,启动应用。点击按钮,WebForm2的控件将显示在WebForm1中放置Literal按钮的地方,如图一,注意页面标题和URL仍旧显示原始页面WebForm1。  

点击查看原图片http://blog.online-edu.org/lifelong/002368.html


JavaScriptBuilder: JavaScript Handler Class for Custom Controls

以前对于XML如何存储数据很感兴趣,特别是看到一个文章说,可以直接用XML代替SQL server2000用来存储数据和交互数据,目前还在研究之中。终于把如何存取图像到xml的代码搞定:)


 


读取图像


//定义图像源与目标xml文件


string ImgFileName = @”d:\中国移动暴强广告.JPG”;


string XmlFileName = @”D:\img.xml”;


XmlTextWriter aXmlTextWriter = new XmlTextWriter(XmlFileName, System.Text.Encoding.Default);


aXmlTextWriter.Formatting = Formatting.Indented;


       try


              {                         


                  aXmlTextWriter.WriteStartDocument();


                     aXmlTextWriter.WriteComment(“Contains a BinHex JPEG image”);


                     aXmlTextWriter.WriteStartElement(“jpeg”);


                    


                     //下边就是通用的读取图像的代码


                     System.IO.FileInfo fi = new System.IO.FileInfo(ImgFileName);


                     int size = (int)fi.Length;


 


                     //read the jpeg file


                     byte []img = new byte[size];


System.IO.FileStream fs = new System.IO.FileStream(ImgFileName, System.IO.FileMode.Open);


                     System.IO.BinaryReader br = new System.IO.BinaryReader(fs);


 


                     img = br.ReadBytes(size);


                     br.Close();


 


                     //注意这里用的是BinHex编码


                     aXmlTextWriter.WriteBinHex(img,0,size);


                     aXmlTextWriter.WriteEndDocument();


              }


              catch(XmlException xmlE)


              {


                     Response.Write(xmlE.Message);


              }


              finally


              {


                     aXmlTextWriter.Close();


              }


显示图像


简单的在窗口中放一个PictureBox,在一个按钮中写如下代码


string XmlFileName = @”D:\img.xml”;


 


XmlTextReader aXmlTextReader = new XmlTextReader(XmlFileName);


aXmlTextReader.Read();


aXmlTextReader.MoveToContent();


 


if(aXmlTextReader.LocalName == “jpeg”)


    {


        System.IO.FileInfo fi = new System.IO.FileInfo(XmlFileName);


        int iSize = (int)fi.Length;


        byte []img = new byte[iSize];


        aXmlTextReader.ReadBinHex(img,0,iSize);


 


        //Byte to image object


        System.IO.MemoryStream ms = new System.IO.MemoryStream();


        ms.Write(img,0,iSize);


        Bitmap bmp = new Bitmap(ms);


        ms.Close();


 


        this.pictureBox1.Image = bmp;


}


aXmlTextReader.Close();


http://www.cnblogs.com/koffer/archive/2004/04/25/7547.aspx

2004年04月19日

由台湾微软RD部门最新完成之中文化ASP.NET入门套件,远比上一版本更容易使用及了解。是学习.NET开发程序不可或缺的最佳入门宝典。 目前提供了电子商务、入口网站、报表建置及项目追踪等四套入门套件。
(立刻前往)

2004年04月18日

大家都知道aspx在同一个页面中传值是很容易的(如textBox1.Text等)但有时必须向另一个页面传值用以前asp的方法的确觉得不怎么样,还要用Request.Form等东西好象又回到了从前。我这里使用一个类的静态属性作为两个类的外的全局变量实现了两个页面间传值.举一个简单的例子如下:


首先定义一个包含静态属性的类:
using System;


namespace study
{
 ///


 /// CIndex 的摘要说明。
 ///

 public class CIndex
 {
  public static string name=”";
  public CIndex()
  {  
  }
 }
}


然后在一个包含信息提交的页面中这样写:


<%@ Page language=”c#” Codebehind=”submit.aspx.cs” AutoEventWireup=”false” Inherits=”study.submit” %>
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN” >
<HTML>
 <HEAD>
  <title>submit</title>
  <meta name=”GENERATOR” Content=”Microsoft Visual Studio 7.0″>
  <meta name=”CODE_LANGUAGE” Content=”C#”>
  <meta name=”vs_defaultClientScript” content=”JavaScript”>
  <meta name=”vs_targetSchema” content=”http://schemas.microsoft.com/intellisense/ie5“>
 </HEAD>
 <body MS_POSITIONING=”GridLayout”>
  <form runat=”server” ID=”Form1″>
   <asp:TextBox id=”textBox1″ runat=”server” />
   <asp:Button text=”提交” runat=”server” ID=”Button1″ />
  </form>
 </body>
</HTML>


Codebehind:
首先引入study命名空间
using study;
再加入Button1的Click事件
private void Button1_Click(object sender, System.EventArgs e)
{
 CIndex.name=textBox1.Text;//将要传到另一页的值赋给类的静态属性
 Response.Redirect(“getsubmit.aspx”);
}


然后在另一个页面里面的codebehind里加入下面代码:
private void Page_Load(object sender, System.EventArgs e)
{
 Response.Write(“你输入的参数值是: “+CIndex.name);
}


这样就完成了.简单吧.


VS.NET下web项目源代码管理 http://www.chinabs.net/aspnet/default.asp?infoid=107


检测含有中文字符串的实际长度


在ASP.NET里也很容易得到它的长度.解决办法如下,str为要检测的字符串:
ASCIIEncoding n = new ASCIIEncoding();
byte[] b = n.GetBytes(str);
int l = 0;  // l 为字符串之实际长度
for (int i=0;i <= b.Length-1;i++)
{
    if (b[i] ==63)  //判断是否为汉字或全脚符号
    {
        l++;
    }
    l++;
}

http://taiwan.cnet.com/enterprise/topic/0,2000062938,20088911,00.htm


过去几年来,IBM/微软连手称霸产业的可能性曾使得升阳坐立不安,但现在总算解除了。


IBM-微软-升阳的三角关系中,IBM是唯一跟其它两家都有不错关系的厂商,而也因为如此IBM才有后来的复苏。在90年代中期,IBM实行新策略,开始取得Java授权,并开发出一套应用服务器(也就是现在的WebShpere),同时也让该公司的Visual Age软件开发工具能更与此一应用服务器兼容。


但随着IBMJava软件策略越来越步入正轨,升阳与IBM对于Java的看法日渐分歧,IBM为了巩固日后能与微软一较长短的本钱,决定必需让升阳与Java技术掌控权脱钩才行。在2000年,IBM仓促组成openserver.org组织,意图拉走升阳的Java授权厂商。但IBM低估升阳与其它Java授权商之间的紧密关系(尤其是甲骨文),使得此一组织后来破局,不过IBM希望瓦解升阳控制的企图一直不曾消失。


其它Java授权商不愿帮忙IBM就算了,但升阳另一个超级对手却很可能有意愿。IBM一面继续授权使用Java,一面也紧密跟微软合作,使尽各种方法,希望有朝一日对于Java的掌握也能跟现在于Linux与开放原始码社群中呼风唤雨一般。


在所有IBM与微软的技术合作中,升阳最害怕的就是JavaWindows之间的兼容性。虽然第三方厂商开发出的互通(在同一部计算机中)后来反变成了升阳控告微软的基础,但IBM与微软开发的互通性却因多了一个网络层而免受官司骚扰。IBMJava作为上不仅得寸进尺,再加上有微软的从旁协助(IBM始终觊觎微软的客户),该公司所开发出的互通程度已经让客户可轻松从微软替换至IBM的软件架构。


Linux在企业端越来越强势,Java则是在应用服务器市场商强过.Net,而在行动领域双方则打成平手。IBM借着与微软连手网络服务的合作(现在又加入了BEA),逐渐弱化升阳对于Java的掌控。微软与升阳突然发现在他们双方都陷入了同样的困境:由于升阳与微软不和,使得IBM左右逢源的作法占尽了市场优势。


为了力挽这种颓势,眼前只有一只选择方式,而微软与升阳也终于正式在4/2日协议携手合作。虽然他们的矛头是对准IBM,但实际上,McNealyBallmer说的也没错,这对客户依然有利。


究竟微软、升阳(两者相加已经拿下99.99%企业市场)与客户可从这桩交易中获得什么好处呢?我们且从两位CEO口中的说法来一探究竟。


·  Java.Net互通不是梦


Ballmer在诉讼气氛下,想要公开讨论实在很难,我曾在高尔夫球场碰到Scott,但我们并没有公开交谈,那时我们也不知道要谈些什么,或该做什么事情。


透露的讯息:两家公司将全面建立沟通管道,从最高层的主管到最底层的技术合作将全部畅通。升阳软件技术长John Fowler向我表示,以前官司还在打的时候,双方连电话都不得打,现在就可以了。这是个全然不同的境界,双方可共同携手的范围很广。


那么究竟哪些地方有合作空间呢?


McNealy「我们会透过既独特又优良的方式让彼此的技术相通。」未来双方从服务器到比客户端都可享有更好的互通性,同时又尊重彼此的IP


透露的讯息:双方在软件堆栈方面将有好几个层级的互通,这包括SolarisWindows操作系统、从SolarisJava(甚至含Linux)客户端到.Net应用服务器、从Windows客户端到Java应用服务器、从Java应用服务器至.Net应用服务器。一般而言,此一协议也消弭了Java.Net阵营你死我活的竞争态势,例如,企业现在至少可松一口气,因为升阳会确保Java手机能与Windows服务器兼容运作。


此外,McNealy针对目前还不存在的相通性用了「独特」(unique)这样的暗示字眼。从Fowler后来的解读显示,微软与升阳之间在软件堆栈上的合作可能存在于JCP的标准Java规格之外。这些JCP之外的技术将有助于升阳与微软连手阻却IBM继续挖他们客户墙角的举动。


Fowler说:「我们的合作计划事前并没有告知IBM,我们的产品(微软与升阳)将比IBM更具良好的互通性,我相信IBM已经感受到这对他们并非好事。」


那么相通的程度是到什么地步呢?


·  Eclipse可能遭排斥


Ballmer「我们在特定技术合作上已经有共识,主要是服务器与客户端如何透过网络相互沟通。Greg(Papadopoulos,升阳技术长)与比尔盖兹已经有好几个月都固定开会,拟出一个互通兼容框架,好让双方架构都能够比平常(假如双方没有合作的话)更具优异的互通模式。」


透露的讯息:Ballmer虽然有明白指出是网络上的互通性,但升阳的Fowler则提醒我别过度解读这段文字。例如,以往完全禁止的JavaWindows同一机器内的兼容性(也就是升阳之前控告微软的部分)现在已经重新端上谈判桌,就等着客户提出的需求。但这种同一机器的兼容性是可透过其它方式来达成,比如透过网络传出,再藉由网络服务通讯协议传回即可,但若是为了效能考虑,采用更直接的互通方式应该更为合理才是。


可别小看这对开发社群的重要性。过去,第三方开发商与企业开发人员(两者都是Java.Net生态系统的要角)都得针对手边项目来考虑要采用何种开发语言与框架,举例来说,由于微软Office提供相当好用的APIs来搭配Office文件与Exchange电子邮件基础建设,因此企业开发人员若偏好升阳的Java就必需引进其它语言与整合开发环境(IDE)到工具箱中,无形中增加不少复杂度与成本。若能直接从Java虚拟机器存取微软的.Net classes(或反之亦然),那开发人员可就轻松多了。


·  C#Java语言整合不可能


对于已经习惯Visual Studio的微软开发人员来说,微软必需授权必要的升阳技术并整合至开发工具中(Visual Studio .Net)。对Java开发人员来说,大家则还需拭目以待,看看升阳要如何将微软授权技术开放给Java程序人员使用。由于升阳跟IBM之间还有竞争心结存在,我们可预期这些功能应该会放在升阳所支持的NetBeans整合开发环境中,但会采以非开放原始码模式,以避免这些技术辗转流入IBM所支持的Eclipse开发环境中。


比较不用期待的是微软C#语言与Java程序语言的整合,这不太可能。


McNealy目前并没有任何合并C#Java语言的计划,也无意整合.NetJava网络服务架构。


透露的讯息:两种语言之间的差异性极大,且升阳与微软在这方面还是保持激烈竞争,因此C#Java合并可说完全不在考虑之列。但若说微软的Visual J#Java是否会有更多共通处,答案很可能会是肯定的。两家公司都深知Java语言月标准化,对开发人员就更有利。若真的能有一套标准出来,则升阳的NetBeans开发工具与微软的Visual Studio将可达成「在符合标准的前提下,各自在实作(implementation)上做竞争。」至于升阳与微软如何把IBM排拒在这场开发大戏中则有待观察。


·  微软可能加入JCP


McNealy也自行表示.NetJava runtime不会合而为一,这是很明显的答案,不过他倒是没谈到授权协议是否有可能让双方开发出可在对方runtime上执行的版本。例如,随着操作系统层变得越来越商品化,而加值功能多半出现在中介软件层中(这也是.NetJava runtime环境的发挥主力),升阳很可能有兴趣当作LinuxSolaris版的.Net供货商共主。这对微软有好处吗?虽然提供UnixLinux版本的.Net有可能侵蚀部分Windows获利,但这部分可轻松从.Net授权费中赚回来。


被问到这种可能性能,升阳的Fowler表示,「我不确定公司会不会这么做,」虽然不排除这种可能,但Fowler也补充说,「这只协议可说让双方有许多商讨空间。」若微软又突然想开发自家版本的Java runtime(之前微软已经做过一次,但也因此惹来官司),那市场不免会想知道微软是否会加入Java Community Process(JCP)。「这得看微软意愿了,」Fowler表示。「若微软愿意加入,我们则很乐意展开会谈。」