当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 浅析ASP.NET中C++和J#的混合应用

ASP.NET
asp.net Server.MapPath方法注意事项
asp.net下常用的加密算法MD5、SHA-1应用代码
几个 ASP.NET 小技巧
ASP.NET内置对象之Application对象
ASP.NET使用正则表达式屏蔽垃圾信息
asp.net“服务器应用程序不可用” 解决方法
asp.net Linq把数据导出到Excel的代码
asp.net ext treepanel 动态加载XML的实现方法
silverlight2.0Beta版TextBox输入中文解决方法
asp.net转出json格式客户端显示时间
asp.net下Linq To Sql注意事项小结
ASP.NET动态加载用户控件的实现方法
asp.net web大文件上传带进度条实例代码
asp.net DZ论坛中根据IP地址取得所在地的代码
向asp.Net进发 数据库连接操作
.net 上传文件前所未有的简单
asp.net gridview代码绑定
asp.net中List的使用方法
Asp.net(C#)实现验证码功能代码
asp.NET开发中正则表达式中BUG分析

浅析ASP.NET中C++和J#的混合应用


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 170 ::
收藏到网摘: n/a

不想搞得太复杂,我仅仅演示实现 DataReader和DataSet,起个抛砖引玉的作用,也顾不得代码结构是否优美、性能是否良好,能够达到本文的目的即可。

为了方便大家亲自动手实践,数据库使用的是ACCESS,文章末尾有下载链接。实际项目中要使用SqlServer和ORACLE的话,把几个OleDb函数换个名字即可,怎么换就不用我多说了。

相同的功能,我用三种语言来实现,首先,给出.NET的“标准语言”——C#版本作为基本参照。

以下是C#版本:

main_cs.dll文件源码:

以下为引用的内容:
using System;
using System.Data;
using System.Data.OleDb;
using System.Text;
    public class main_cs:System.Web.UI.Page
    {
        OleDbDataReader dr;
        OleDbCommand cmd;
        DataSet ds;
        OleDbDataAdapter adp;
        OleDbConnection conn;
        StringBuilder connStr;
        public void Page_Load()
        {
            connStr = new StringBuilder("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=");
            connStr.Append(Server.MapPath("image.mdb"));
            conn = new OleDbConnection(connStr.ToString());
            cmd = new OleDbCommand("SELECT title FROM image_data",conn);
            conn.Open();
            dr = cmd.ExecuteReader();
            while(dr.Read())
            {
                Response.Write(dr["title"]);
            }
            dr.Close();
            conn.Close();
            ds = new DataSet();
            adp = new OleDbDataAdapter("SELECT title FROM image_data",conn);
            adp.Fill(ds);
            Response.Write(ds.Tables[0].Rows[0]["title"]);
        }
    }

以下是C++版本:

在VisualStudio2003中创建C++.Net类库,命名net_dll,项目中引用System.Data、System.Web、System.XML,生成net_dll.dll文件,以下是主文件全部源码(其它那些头文件、资源文件什么乱七八糟的统统不用理会,当它们不存在):

以下为引用的内容:
#include "stdafx.h"
#include "net_dll.h"
#using
#using
#using
#using
using namespace System;;
using namespace System::Xml;
using namespace System::Web;
using namespace System::Text;
using namespace System::Data;
using namespace System::Data::OleDb;
public __gc class main : public System::Web::UI::Page
{
private:
    OleDbDataReader __gc* dr;
    OleDbCommand __gc* cmd;
    DataSet __gc* ds;
    OleDbDataAdapter __gc* adp;
    OleDbConnection __gc* conn;
    StringBuilder __gc* connStr;
public:
    void Page_Load()
    {
        connStr = new StringBuilder("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=");
        connStr->Append(HttpContext::Current->Server->MapPath("image.mdb"));
        conn = new OleDbConnection(connStr->ToString());
        cmd = new OleDbCommand("SELECT title FROM image_data",conn);
        conn->Open();
        dr = cmd->ExecuteReader();
        while(dr->Read())
        {
            Response->Write(dr->get_Item("title"));
        }
        dr->Close();
        conn->Close();
        ds = new DataSet();
        adp = new OleDbDataAdapter("SELECT title FROM image_data",conn);
        adp->Fill(ds);
        Response->Write(ds->Tables->get_Item(0)->Rows->get_Item(0)->get_Item("title"));
    }
};
 
以下是J#版本:

道理同C++,使用J#创建类库,命名main_jsl,项目中引用System.Data、System.Web、System.XML,源码如下:

以下为引用的内容:
import System.Data.*;
import System.Data.OleDb.*;
import System.Web.*;
import System.Text.*;
public class main_jsl extends System.Web.UI.Page
{
    OleDbDataReader dr;
    OleDbCommand cmd;
    DataSet ds;
    OleDbDataAdapter adp;
    OleDbConnection conn;
    StringBuilder connStr;
    public void Page_Load()
    {
        connStr = new StringBuilder("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=");
        connStr.Append(get_Server().MapPath("image.mdb"));
        conn = new OleDbConnection(connStr.ToString());
        cmd = new OleDbCommand("SELECT title FROM image_data",conn);
        conn.Open();
        dr = cmd.ExecuteReader();
        while(dr.Read())
        {
            get_Response().Write(dr.get_Item("title"));
        }
        dr.Close();
        conn.Close();
        ds = new DataSet();
        adp = new OleDbDataAdapter("SELECT title FROM image_data",conn);
        adp.Fill(ds);
        get_Response().Write(ds.get_Tables().get_Item(0).get_Rows().get_Item(0).get_Item("title"));
    }
}

完毕,DLL文件放置在站点根目录的Bin文件夹下面即可。

以上三个文件的功能完全是一样的。

通过以上三种代码的观察,我们可以发现,C#的代码相当简洁(其实能够写得最简洁的是Jscript.Net,下篇文章再说),J#其次,C++就比较难看了。

在DataTable和DataReader的操作上,可以看到J#和C++大量使用了get_Item()函数,我估计J#和C++都是经过Object变换的,可能会对性能造成少许的影响。

使用这两种语言创建ASP.NET,对于习惯了C++和JAVA的朋友来说,可能会比较有用。

我相信每种语言都有它的长处,大家互相取长补短,构造一个良好的整体,曾经看到过不少C#的初学者,似乎都对VB.NET有偏见,以“从来不用VB”为荣耀,还有一些朋友,对C++.Net和J#的了解比较少,便误会为这两种语言没有用途,实际上这些认识都是片面的。

我举个例子:

以下为引用的内容:
/* Jscript | Jscript.Net */
var conn = Server.CreateObject("ADODB.Connection");
conn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Server.MapPath("image.mdb"));
var rs = conn.Execute("SELECT * FROM image_data");
while(!rs.EOF)
{
Response.Write(rs("title").value);
rs.MoveNext();
}
rs.Close();
conn.Close();

不用认为这只是ASP,这同样也是地地道道的ASP.NET。虽然在我们.NET开发者的眼中,RecordSet的名声可能没有DataReader要好,但是这不在本文的讨论范围,这里只说:倘若硬是要用C#实现以上相同功能的话,结果只能是 执行慢、代码长、结构复杂。

在.NET的世界里,没有哪个语言最好、哪个语言最烂的说法,五个语言各自有长处短处,大家生成的都是IL中间代码,也就是说,它们天生就可以互相融合,这才是.NET的精髓之所在。