(原創) 如何用C++開發ASP.NET? (.NET) (C++/CLI) (ASP.NET) (C/C++)

Abstract
很多人說C++無法開發ASP.NET,ANSI C++的確不能,但C++/CLI則可以,事實上,任何.NET下的語言都可以開發ASP.NET,雖然Visual Studio 2005工具不見的支援,但只要透過一些小技巧,你依然可以用妳喜歡的.NET語言開發ASP.NET。

Introduction
在Visual Studio .NET 2002剛出來時,我就曾經聽過同事說過他用C++寫過ASP.NET,不過由於當時才剛剛學C#,還不會C++,所以也沒問他是怎麼寫的,一直到最近開始學C++,發現在Visual Studio 2005可以用C++/CLI開發Windows Form,但卻無法開發ASP.NET,實在令人遺憾。在網路上也只在Code Project談到在Visual Studio .NET 2002下用Managed C++寫ASP.NET(ASP.NET with Managed C++),但Managed C++和C++/CLI的語法不太一樣,原本的範例無法compile成功,經過一段研究之後,終於找到了用C++/CLI撰寫ASP.NET的方式。在這篇文章中,我將一步步的介紹如何用C++/CLI開發ASP.NET程式。

 


Step 1:
建立Web Site

首先,建立一個新的Web Site,由於Visual Studio 2005在ASP.NET沒支持C++,所以建立Web Site時,先隨便選一個語言建立。

 

Step 2:
建立Web Form
建立一個Web Form名為HelloWorld.aspx,請不要選擇Place code in separate file,這樣Visual Studio 2005會將Event Handler放在aspx檔中,可以讓aspx.cpp省掉event宣告的程式。



Step 3:
加入GUI
使用Web Form Designer做出以下的介面。



Step 4:
修改HelloWorld.aspx
在Page Directive部分,將Language=”C#”刪除,加上AutoEventWireup="true" Inherits="HelloWorld",HelloWord為C++的Class名稱。也要將<script runat="server"></script>部分刪除。

 1 ExpandedBlockStart.gif ContractedBlock.gif <% dot.gif @ Page AutoEventWireup="true" Inherits="HelloWorld"  %>
 2 None.gif
 3 None.gif <! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
 4 None.gif < html  xmlns ="http://www.w3.org/1999/xhtml" >
 5 None.gif < head  runat ="server" >
 6 None.gif   < title > Untitled Page </ title >
 7 None.gif </ head >
 8 None.gif < body >
 9 None.gif   < form  id ="form1"  runat ="server" >
10 None.gif     < div >
11 None.gif      Using C++/CLI in ASP.NET < br  />
12 None.gif       < br  />
13 None.gif       < asp:Button  ID ="Button1"  runat ="server"  OnClick ="Button1_Click"  Text ="Button"   />
14 None.gif       < asp:Label  ID ="Label1"  runat ="server"  Text ="Label" ></ asp:Label ></ div >
15 None.gif   </ form >
16 None.gif </ body >
17 None.gif </ html >
18 None.gif


Step 5:
建立C++ project
在左側選擇CLR,此為.NET platform的Project,右側選擇CLR Empty Project即可,切記不要選擇Class Library,這樣會多出很多我們不需要的檔案,而且最後我們也不會用Visual Studio 2005來compile,會使用Command Prompt的方式compile。
cpp_aspnet_00.gif

cpp_aspnet_01.gif


Step 6:
建立HelloWorld.aspx.cpp。
左側選擇Code,右側選擇C++ File(.cpp)

cpp_aspnet_02.gif

Step 7:
加入C++/CLI程序
C++/CLI對ANSI C++做了些擴充,為了和C++內建的型別與Class做區別,Managed的Class需加上ref modifier,而Managed的Object要加上^。最重要的,IDE支援Intellisense方式寫ASP.NET。

C++/CLI / HelloWorld.aspx.cpp

 1  # using   < system.dll >
 2  # using   < mscorlib.dll >
 3  # using   < system.web.dll >
 4 
 5  using   namespace  System;
 6  using   namespace  System::Web::UI::WebControls;
 7 
 8  public   ref   class  HelloWorld :  public  System::Web::UI::Page {
 9  protected :
10    Button  ^ Button1;
11    Label  ^ Label1;
12 
13  public :
14     void  Button1_Click(Object  ^ sender, EventArgs  ^ e) {
15       this -> Label1 -> Text  =   " Hello World " ;
16         return ;
17    }
18  };


Step 8:
編譯程式
使用Visual Studio 2005 Command Prompt編譯C++/CLI。
cpp_aspnet_03.gif

使用以下的語法編譯C++/CLI。

None.gif 1cl /clr HelloWorld.aspx.cpp /link /dll /out:HelloWorld.dll


Step 9:
Deploymemt
最後只要將HelloWorld.aspx放到c:\Inetpub\wwwroot\下,HelloWorld.dll放到c:\Inetpub\wwwroot\bin\下,就完成deployment。

Conclusion 
很多人說C++無法開發ASP.NET,ISO C++的確不能,但C++/CLI則可以,事實上,任何.NET下的語言都可以開發ASP.NET,雖然Visual Studio 2005工具不見的支援,但只要透過一些小技巧,你依然可以用妳喜歡的.NET語言開發ASP.NET。

(01/27/2007更新)
這篇文章得到很大的迴響,大概因為這是世界上第一篇使用C++/CLI開發ASP.NET的討論,不過回到現實,真的該用C++開發ASP.NET嗎?

老實說,C++/CLI開發ASP.NET真的比較麻煩,而且用C++/CLI在執行速度也不會比C#快多少,實務上還是建議使用C#開發Web應用程式,用C++開發系統程式(驅動程式,kernel..),畢竟兩者定位不同。

若你真的還是很堅持非用C++不可,以下是我的建議:
採用多層式架構
1.Presentation Layer : ASP.NET部分用C#寫,主要是Visual Studio 2005工具支援完整。
2.Business Layer / Data Access Layer: 這裡可以用C++/CLI寫,這裡不牽涉到UI,只牽涉到邏輯和資料,你可以在這裡盡情的發揮C++在OOP,STL,GP上的優勢。
3.Database : 這裡還是要用SQL Server或Oracle。

我這篇文章,主要也是證明C++還是可以寫ASP.NET,但並沒有推薦大家一定要這樣寫,主要還是Visual Studio 2005的支援度不夠,寫起來不方便,若下一個版本Microsoft願意讓Visual Studio直接支援C++/CLI開發ASP.NET,若你又是C++忠實信徒,那就真的推薦用C++開發ASP.NET了。

另外直得一題的是,C++要開發ASP.NET,用的是C++/CLI而非ISO C++,雖然C++/CLI包含了所有ISO C++,但還有一些闊充的語法,如pointer變成^,reference變成%...等,當然C++/CLI也是相當有趣的主題,值得一學。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一款真正意义上适合软件界面开发的C++界面库。采用XML管理GDI资源(如:图片、字体、颜色等),最大程度将界面与逻辑分开,让程序员有更多的时间去进行软件内部的逻辑处理。SKINSE扩展了非常丰富的API接口,兼容其他界面控件,使界面开发更加灵活、高效。SkinSE只用到了windows几个底层的核心库,没有用到(MFC/ATL等第三方库),采用纯API编写,采用C语言导出方式,增强可移植性,可以用于多种计算机语言。 1.SKINSE界面库内部没有完全采用HOOK拦截窗口的机制,主要采用子类化控件,修改窗口过程函数的方式进行界面美化。但是内置HOOK技术,可以动态设置HOOK,保证了SKINSE在整理构架上的灵活性。 2.SKINSE界面库内置DirectUI绘制思想,将界面绘制元素抽象成图片、文本、矩形区域、线条、动画,并且内置EventItem、DrawItem绘制机制。可以将这些绘制元素以及绘制机制组合开发,实现按钮、单选框、复选框、分组框、Tab控件、动画控件等界面控件。 3.SKINSE界面库提供了非常丰富的API接口,最大限度的让SKINSE界面库更加透明化、个性化,让SKINSE界面库的使用范围得到最大延伸。 4.SKINSE界面库在子类化进行控件美化的时候,尽量不修改控件的默认属性,最大程度地兼容window标准控件的默认属性。比如,目前市场上很多界面库在绘制窗口标题栏的时候,去掉了窗口的WS_CAPTION属性, 导致GetClientRect、GetWindowRect方法失效,从而加大了界面开发和设计的难度,当然也导致不能完美支持SDI/MDI等界面框架。 5.SKINSE界面库提供了界面控件动态布局的特性。省去了程序开发中最为繁琐的窗口控件位置的调整。只需要调整一下XML配置属性,就可以进行完美布局。 6.SKINSE界面库支持BMP、ICO、PNG、JPG等图片格式,支持皮肤色调变换,提供SKINSE内部的图像引擎接口。 7.SKINSE界面库支持SDI、MDI等界面框架,支持20余种界面控件,完整兼容window 2000、window2003、window XP、vista、window7当前的主流操作系统。并且支持window平台的VC、.NET、VB6、Delphi、C++ Builder、PowerBuilder、易语言等多种计算机语言开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值