使用ASP調用C#寫的COM+組件

來源:互聯網
上載者:User

使用ASP調用C#寫的COM+組件

1 建立類庫MyTestDLL

2 右擊項目“MyTestDLL”-》屬性-》產生-》勾選“為COM互操作註冊”

3 開啟 AssemblyInfo.cs 檔案 修改 [assembly: ComVisible(true)], 添加強命名檔案.

4 開啟Visual Sutdio 2008 的命令提示行工具輸入guidgen.exe 選擇DEFINE_GUID 單擊 "New GUID"

5代碼

      1、每個類名對應一個介面名,介面名是類名前加上一個大寫的I

      2、介面中聲明的方法要使用屬性 [DispId(n)]

      3、類必須有一個無參建構函式

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

using System.EnterpriseService
namespace MyTestDll
{

     //  這裡Guid為第4步產生的。
    [Guid("FFA4B191-FB5B-4dd5-B7B1-B2F32BF6F1FF")]
    public interface IMyTestDll
    {
        [DispId(0)]
        string GetAbout();
    }
    public class Test1:IMyTestDll
    {
        private string summary;
        public Test1()
        {
            summary = "這是我的第一個測試";
        }
        public string GetAbout()
        {
            return summary;
        }
    }
}

 

6 產生項目

ASP測試代碼 

<%  
  Dim  o   
  Set o = Server.CreateObject("MyTestDll.Test1")  
  Response.Write o.GetAbout()
  Set o=Nothing 
 
  %>  

提示:如果要在其他的電腦使用我們用C#開發的這個COM組件還需要是用regasm來註冊

方法為:

首先把bin\Debug目錄的檔案拷貝到目標電腦上,然後開啟命令提示行工具輸入:
regasm 你拷貝到的目錄/檔案名稱.dll /tlb f:/dll/檔案名稱.tlb /codebase

 運行既可在該電腦上使用。
 

 Com+ 執行個體

一. AssemblyInfo.cs

using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.EnterpriseServices;

// 有關程式集的常規資訊通過下列屬性集
// 控制。更改這些屬性值可修改
// 與程式集關聯的資訊。
[assembly: AssemblyTitle("MyComPlusSample")]
[assembly: AssemblyDescription("MyComPlusSample Testing")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Axisoft")]
[assembly: AssemblyProduct("MyComPlusSample")]
[assembly: AssemblyCopyright("Copyright Axisoft 2010")]
[assembly: AssemblyTrademark("Web Cornucopia")]
[assembly: AssemblyCulture("en-US")]

// 將 ComVisible 設定為 false 使此程式集中的類型
// 對 COM 組件不可見。如果需要從 COM 訪問此程式集中的類型,
// 則將該類型上的 ComVisible 屬性設定為 true。
[assembly: ComVisible(true)]

// 如果此項目向 COM 公開,則下列 GUID 用於類型庫的 ID
[assembly: Guid("4bc9a9f7-606c-4552-a3fe-aefb39b00ed1")]

// 程式集的版本資訊由下面四個值組成:
//
//      主要版本
//      次版本
//      組建號
//      修訂編號
//
// 可以指定所有這些值,也可以使用“組建號”和“修訂編號”的預設值,
// 方法是按如下所示使用“*”:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

[assembly: AssemblyDelaySign(false)]
[assembly: ApplicationAccessControl(true)]
//[assembly: AssemblyKeyFile("MyComPlusSample.snk")]
//[assembly: AssemblyKeyName("")]

//[assembly: ApplicationName("COM+ Bank Server Account Manager")]
//[assembly: ApplicationActivation(ActivationOption.Server)]

二. Transerfer.cs

using System;
using System.Collections.Generic;
//using System.Linq;
using System.Text;
using System.EnterpriseServices;
using System.Data.SqlClient;
using System.Data;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.InteropServices;

[assembly: ApplicationActivation(ActivationOption.Server)]
// 不是必須的,可以在部署的時候進行設定。
[assembly: ApplicationName("MyComPlusSample")] 
namespace MyComPlusSample
{
    /// <summary>
    /// Transfer 的摘要說明。
    /// </summary>
    ///
    /// Configure component's Transaction Option
    [Transaction(TransactionOption.Required)]
    //[ObjectPooling(true,1,100)] //設定對象可以放到池中
    [ClassInterface(ClassInterfaceType.AutoDual)]
    /// Enable event tracking
    [EventTrackingEnabled(true)]
    /// Enable JITA for the component
    [JustInTimeActivation(true)]
    [ComVisible(true)]
    public class Transfer:ServicedComponent
    {
        public Transfer()
        {
            ConsoleWrite(" UCOMBANK.TRANSFE Constructor" );
        }
        public Transfer(string s)
        {
            ConsoleWrite(" UCOMBANK.TRANSFE Constructor" + s);
        }

        private void ConsoleWrite(string strInput)
        {
            EventLog.WriteEntry("UCOM COM+ Service Sample", strInput, EventLogEntryType.Information);
        }

        protected override void Activate()
        {
            ConsoleWrite(" UCOMBANK.TRANSFE Activated");
        }

        protected override void Deactivate()
        {
            ConsoleWrite(" UCOMBANK.TRANSFE Deactivated");
        }
        protected override void Construct(string s)
        {
            base.Construct(s);
        }
        protected override bool CanBePooled()
        {
            ConsoleWrite(" UCOMBANK.TRANSFE CanBePooled");
            return true;
        }
        protected override void Dispose(bool disposing)
        {
            ConsoleWrite(" UCOMBANK.TRANSFE Dispose");
           
            base.Dispose(disposing);
        }

        //public int GetBalance(string strConnectiongString, string tableName, string id, ITransaction trans)
        [ComVisible(true)]
        public int GetBalance(string strConnectiongString, string tableName, string id)
        {
            SqlConnection conn = new SqlConnection(strConnectiongString);
            SqlDataAdapter da = new SqlDataAdapter("select * from " + tableName + " where account=" + id, conn);
            DataSet ds = new DataSet();
            //在執行下面的語句時出現錯誤,錯誤資訊是:"在分散式交易中登記時出錯。"
            da.Fill(ds);
            if (ds.Tables[0].Rows.Count > 0)
                return int.Parse(ds.Tables[0].Rows[0]["accountid"].ToString());
            else
                return 0;
        }
        [ComVisible(true)]
        public string GetInfo()
        {
            return "My com plus sample...";
        }
        [ComVisible(true)]
        public int GetUserID(string connstr, string tableName, string account)
        {
            try
            {
                int rst;
                //rst = GetBalance(connstr, tableName, account, (ITransaction)ContextUtil.Transaction);
                rst = GetBalance(connstr, tableName, account);
                ContextUtil.SetComplete();
                return rst;
            }
            catch (Exception ex)
            {
                ContextUtil.SetAbort();
                ConsoleWrite(ex.Message.ToString());
                return 0;
            }
        }

    }
}

 

三. 註冊

  gacutil /i MyComPlusSample.dll 添加到GAC

  regsvcs /fc MyComPlusSample.dll 註冊已存在重新註冊, fc = find Create

  ComponentServices中找到註冊的Com組件, Tab:Security中不勾選Enforce access checks fot this applicaion; Tab:Identity 中指定一使用者.

四. ASP調用

  

<%

on error resume next

dim tempsql
tempsql = "3eeee---" & _
"eeerer7777erere"
set obj = Server.CreateObject("MyComPlusSample.Transfer")

dim str1
str1 = obj.GetInfo()
response.write("strEnCript=" & str1 & "<br>")

if err.number <> 0 then
 response.write tempsql + "<br>"
 response.write err.description + "<br>"
 response.write "9999999999999999999999999"
 response.end
end if

%>

 

參考資料:

 

http://topic.csdn.net/u/20080625/13/0294fe91-200c-4939-b36b-c9a2c6781354.html

http://topic.csdn.net/t/20060314/15/4613620.html

http://cplus.e800.com.cn/articles/2009/211/1234338268521_3.html

http://topic.csdn.net/t/20020712/10/868557.html
http://www.itzhe.cn/news/20071123/21768.html

http://www.cnblogs.com/illele/archive/2007/10/25/937050.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.