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

posted on 2010-12-09 09:48  Black Bean  阅读(883)  评论(2编辑  收藏  举报