c#继承com

大概看了一下书,照做了一下,感觉功能上主要就是能实现一个事务的功能,其他的没有看到什么新鲜的东东。还有就是这个也能实现remoting那种功能, 可以计算机间通信,不过书里讲的也不深,自己又懒得找资料看了,大概也就是明白了一个基本的实现和使用吧。对com+组件的设置可以在程序里用属性设置, 也可以在com+组件服务浏览器里进行设置。下面是有组件和无组件的代码

有组件:
using System;
using System.Collections.Generic;
using System.Text;
using System.EnterpriseServices;
using System.IO;
using MySql.Da
ta.MySqlClient;
using MySql.Da ta;


//在这里进行的配置,都可以在管理工具中的组件服务中进行相应的配置,服务组件使用regsvcs dllname.dll的方式来部署
//要调用这种有组件的服务,调用程序需要引用System.EnterpriseServices和这个组件的dll

[assembly:ApplicationName("EnterpriseServiceTest")]//在componentservice浏览器中显示的应用程序的名字
[assembly:Description("An EnterpriseService Test")]//关于这个程序的描述文本,将显示在componentservice浏览器中的com+应用程序属性中

//指定此程序是运行在客户机(调用方)的进程中(ActivationOption.Library)还是运行在一个单独的进程中(ActivationOption.Server)
//如果使用ActivationOption.Library则在使用componetservice浏览器创建安装包的时候,就不能使用application proxy选项
//这个选项也可以在注册后,在组件服务中设置和修改。如果使用ActivationOption.Server,则可以在组件服务中导出时,生成代理MSI安装文件,然后在客户机中
//执行对代理的安装,并在客户机上的客户端应用程序引用安装的DLL文件,实现类似remoting效果的远程通信,也可以只生成类库的msi安装文件,直接在其他计算机中
//安装,并在客户应用程序中引用安装的DLL即可直接在本机使用组件的功能
[assembly:ApplicationActivation(ActivationOption.Library)]
[assembly:ApplicationAccessControl(false)]//定义程序的安全配置,bool值表示是否启用访问控制
namespace EnterpriseServiceTest
{
public interface IEnterpriseServiceTest
{
string ProceedStr(string str);

}

[EventTrackingEnabled(true)]//标志是否能用componentservice浏览器来监视这个对像,默认是false,因为允许监视会降底程序性能
[Description("A TestComponet")]//浏览器中组件属性中显示的描述文本

//如果指定了 JIT 激活,则不能在 COM+ 目录中禁用该激活功能,反之亦然。如果在 COM+ 目录中启用了该激活功能,则必须在组件中指定该功能。
//对于在 COM+ 中配置的组件,JIT 激活默认为关闭;但如果请求自动事务,则自动启用 JIT 激活。
//使用类在实例化的时候不激活,而是在调用第一个方法时激活
[JustInTimeActivation(false)]

[ObjectPooling(1,10)]//如果组件初始化需要时间较长,则可以用此属性配置对像池,设置对像池的最小和最大对像数
//Required如果已经运行在一个事务中就使用当前的事务,如果没有事务,则创建一个新的
//RequiresNew不管是否已经运行在一个事务中,都创建一个新的事务,并运行于其中
//Supported如果运行在一个事务中就使用当前的事务,如果没有事务,则不会创建新事务
//NotSupported即使存在一个事务,也不会运行在这个事务当中
//Disabled忽略当前环境中的任何事物处理
[Transaction(TransactionOption.Required)]
//ConstructionEnabled第二个参数的值会显示在componentservice浏览器中的Activation设置中,先可以通过那里来修改这个值,最终这个值可以通过
//ServicedComponent类中的Construct方法得到
[ConstructionEnabled(true, Default = "Database=Test;Da ta Source=192.168.1.3;Port=3306;User Id=root;Password=1980425")]
//ServicedComponent是所有服务组件类的基类,为激活和构造提供了一些方法。
//启动了使用继承了ServiceComponet类的类的程序,都会自动启动配置com+应用程序,但启动程序必须有相应的权限才能进行配置。
//手式配置则使用.net提供的regsvcs assemblyname(xxx.dll),配置好后可以在管理工具中的组件服务中com+应用程序中来验证配置是否成功
//此程序集的生成要使用强名称来升成,否则在进行上面的安装配置的时候会失败,另外.net的类库创建的时候默认的是ComVisible是false
//要在AssemblyInfo.cs文件中,将这个属性更改成true才可以成功安装
public class TestComponent:ServicedComponent,IEnterpriseServiceTest
{

private string connStr = "";

protected override void Construct(string s)
{
this.connStr = s;
}

#region IEnterpriseServiceTest 成员

//这个属性表明自动处理事务,如果成功,则自动调用 ContextUtil.SetComplete来完成事务,
//如果事务过程当中发生了问题抛出异常,则自动调用ContextUtil.SetAbort来中止事务处理,
//如果不使用这个属性则需要自己在程序中手动调用它们来完成或中止事务
//支持事务的方法执行的任务(所执行的代码)得是支持事务操作的,才能显出事务的效果来(比如写数据库),如果不支持事务,
//则使用这个也无法进行回滚等等(比如写文件,更改变量的值,只要成功完成后,即使调用ContextUtil.SetAbort也无法对已经完成的操作进行回滚(比如:
//将写好的文件变回写之前的状态,或者将改变的变更变回原值等等)
//另外ContextUtil.EnableCommit表示对事务处理满意ContextUtil.DisableCommit表示对事务处理不满意,但都没有表示事务完成。
//[AutoComplete()]
public string ProceedStr(string str)
{
MySqlConnection conn = null;

try
{
conn = new MySqlConnection(this.connStr);
string cmdStr = "insert into t1(name) values('wo cao ni ma')";
MySqlCommand cmd = new MySqlCommand(cmdStr, conn);
conn.Open();
cmd.ExecuteNonQuery();
cmd.ExecuteNonQuery();
ContextUtil.SetComplete();//这句提交完成不起作用,要以方法最后执行的设置为准

cmd.CommandText = "insert into t1(name) values('hello')";
cmd.ExecuteNonQuery();
ContextUtil.SetComplete();
return "ok";
}
catch (Exception ex)
{
ContextUtil.SetAbort();//如果没有下面一句,则整个三句将都没有插入成功
ContextUtil.SetComplete();//这样执行后,前两句没错的语句成功插入,最后一句没有插入
throw ex;
}
finally
{
if (conn != null)
conn.Close();
}

}

#endregion
}
}


无组件:

using System;
using System.Collections.Generic;
using System.Text;
using System.EnterpriseServices;
using MySql.Da ta;
using MySql.Da ta.MySqlClient;

namespace NoComptESTest
{
public class NoComptTest
{
//没有组件的服务就是使用ServiceConfig来配置服务,然后调用ServiceDomain.Enter(config)来使用配置创建环境,事务的提交与使用组件的服务是一样的
//使用ContextUtil或使用[AutoComplete()]属性来修饰方法,最后再调用ServiceDomain.Leave()来释放环境
//没有组件的服务是不能拥有全部的功能,而且调用的程序也不用像有组件的服务那样的还需要引用System.EnterpriseServices,只需要引用这个程序集就行了
public static bool Execute(bool isAdd)
{
ServiceConfig config = new ServiceConfig();
config.Transaction = TransactionOption.Required;
ServiceDomain.Enter(config);
MySqlConnection conn = null;
try
{
conn = new MySqlConnection("Database=Test;Da ta Source=sai;Port=3306;User Id=root;Password=1980425");
string cmdText = "insert into t1(name) values('ni ma bi')";
MySqlCommand cmd = new MySqlCommand(cmdText, conn);

conn.Open();

cmd.ExecuteNonQuery();

cmd.ExecuteNonQuery();

cmd.ExecuteNonQuery();

if (isAdd)
ContextUtil.SetComplete();
else
ContextUtil.SetAbort();
return true;

}
catch (Exception ex)
{
ContextUtil.SetAbort();
Console.WriteLine(ex.ToString());
return false;
}
finally
{
if (conn != null)
conn.Close();
ServiceDomain.Leave();
}
}
}
}


调用组件代码:
using System;
using System.Collections.Generic;
using System.Text;



namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//EnterpriseServiceTest.TestComponent t = new EnterpriseServiceTest.TestComponent();
//using (t)
//{
//    Console.WriteLine(t.ProceedStr("hiu"));
//}
//test();  
//using(NoComptESTest.NoComptTest)
{
NoComptESTest.NoComptTest.Execute(false);
}
}


}
}

你可能感兴趣的:(com)