使用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