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

ASP.NET
赫赫大名的A*寻路算法(vb.net版本)
asp.net(c#)下Jmai去说明 使用与下载
[原创]完美解决Could not load file or assembly ''AjaxPro.2'' or one of its dependencies. 拒绝访问。
asp.net下gridview 批量删除的实现方法
用CSS实现图片倾斜 只支持IE
.net get set用法小结
vs 不显示行号的操作方法
ASP.NET页面进行GZIP压缩优化的几款压缩模块的使用简介及应用测试!(附源码)
ASP.Net不执行问题一解
asp.net 无限分类
让VS2008对JQuery语法的智能感知更完美一点
扩展方法ToJSON() and ParseJSON()
asp.net下PageMethods使用技巧
Linq to SQL Delete时遇到问题的解决方法
实现ASP.NET多文件上传程序代码
ASP.NET AJAX 1.0 RC开发10分钟图解
asp.net get set用法
ASP.NET下使用WScript.Shell执行命令
asp.net2.0实现邮件发送(测试成功)
Asp.net 无限级分类实例代码

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 193 ::
收藏到网摘: 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的精髓之所在。