公司的产品用VB6开发了很多的Com+组件,代码维护到现在,重新用.net开发自然代价巨大。
话说有一个客户要求将此产品与另一系统进行集成,我们采用了WCF作为集成的方式,由我负责开发相关的WCF接口。
我的基本设想如下,由客户端发起调用,并启动客户端事务,服务端接收到客户端的调用后,如果存在客户端事务,就使用这个事务,不存在,就新建一个事务。
在代码中,我对数据进行了一番操作后,紧接着创建了一Com+对象,方式如下
dynamic doc= Activator.CreateInstance(Type.GetTypeFromProgID("DocCreate.Creater"));
然后,在客户端放弃提交事务之后,我发现单据还是导入了。这个COM+组件没有使用WCF中的环境事务,原因只是因为.net中的事务如果要跨线程传播,要使用依赖事务。
如果组件是.net开发的,我当然可以使用了,问题是这个Com+组件怎么使用.net创建的环境事务。Com+组件是在dllhost.exe程序中运行的,不在同一个线程中。
经过很长时间的寻找,才找到在System.EnterpriseServices命名空间下有个BYOT类,改成如下的调用方式,问题就解决了:
dynamic saver = BYOT.CreateWithTransaction(Transaction.Current, Type.GetTypeFromProgID("DocCreate.Creater"));