新事务之一: dotNET和COM+中的事务(1)

本文聚焦dotNET和COM+的事务编程。COM+是Windows平台分布式和企业级开发方案,dotNET是Microsoft面向Web的开发平台。文中消除了dotNET、CLR、COM、COM+的模糊概念,还介绍了dotNET环境下使用COM+及事务服务的步骤,包括实现类、声明事务等。

新事务之一: dotNETCOM+中的事务  


小气的神

2002-4-16

 

Article Type: In-Depth 

难度等级:6/9       

版本:2.32

 

 

COM+早于dotNET出现,并且在这几年成为我们在Windows平台下进行分布式和企业级开发的一个解决方案和操作平台,它预置了一些面向企业级应用的通用和底层设施,特别是多层应用模型的中间层的基础设施模块,借助它可以使得开发人员有更多的精力放在应用的业务逻辑本身,有趣的是有时它并不真的让我们满意,值得一提的是从它的父辈开始,都一直是操作系统的一部分。dotNET则是Microsoft最近发表的下一代的一个面向Web的开发平台,比起它所有的前任都显得野心勃勃和气势庞大,所以说足够疯狂和让人振奋。对于dotNET来说COM+是一个成熟而意义重大的历史伙伴,而对于COM+来说dotNET是一个新鲜而略带侵略性的新贵朋友,无论两者如何,对于相对局外的开发人员来说,如何和它们相处和交互将成为一个不小的瓶颈,有些糟糕的是dotNETCOM+在我们之外,而且在不断发展和变化。所以一定有一些有趣的事情,而我们把范围缩小,聚焦在我们开发过程中可能密切相关的事务编程上,可以说,变化带来了许多新的变化而且也带来了许多开发人员的新的思考,在后面的文章中你们会陆续看到他们的思考给我带来的启发和益处,那么希望同样也能给更多的人带来启发和思考。

 

消除一些模糊的概念

一段时间以来我们对dotNETCLRCOMCOM+存在一些模糊不清的概念,dotNETMicrosoft定义的下一代的开发平台。CLR(Common Language Runtime)dotNET的核心和心脏,也是MicrosoftECMA规范的一个Windows平台的实现。COM(Component Object Model)是一个组件对象模型,提供了组件之间交互和作用的基本机制和原则,它是一项组件开发技术和编程模型。COM+是一个组件运行环境,是提供了一系列有关分布式系统功能的Services集合的组件运行环境和工具包。CLR替代了COM,但是无法也没有替代COM+COM+现在叫.NET Enterprise Services,当然如果不带.NET的前缀,Enterprise Services最能体现COM+的作用和定义。CLR离应用层近一些,而COM+离操作系统更近一些,对于最近的Windows.NET的操作系统对COM+进行的一系列增强:Application PartitioningApplication Pooling and RecyclingResource ManagerConfigurable Transaction Isolation LevelWeb Services等等(详见Juval Lowy的文章)来说,有些低级的程序APICLR还根本无法有相应的功能提供,还需要wrapping 这些新的COM+ APIs。当然不能肯定未来的未来,这些COM+API是用C#或其它的CLR-managed API直接实现。目前可以说,如果以前你用COM技术在COM+环境下工作的很好(或者很痛苦),那么现在用CLRCOM+下工作起来一样也很好,并且要方便,快捷;dotNET使得开发人员使用COM+更加方便和有效率,这就如同许多年以前从字符键盘界面(COM)引入图形鼠标界面(dotNET)是对计算机的使用(COM+)的一场革命一样。

 

dotNET中使用COM+的事务服务

dotNET环境下使用COM+以及事务服务要经过下面一些步骤:

1. 实现一个COM+Configured

我们只用从System.EnterpriseServices.ServicedComponent继承一个自己的类,然后提供一个缺省的构造函数

2. 声明分布式事务

只用这类名前面加事务属性即可比如:[Transaction(TransactionOption.Required) ]

3. 提交事务

IObjectControl::SetComplete或是直接使用自动完成属性 [AutoComplete()]

4. 其它的IObjectConstructIObjectControlPoolingJustInTimeActivation

A)        IObjectConstruct :类名前加[ConstructionEnabled(Default="Connection String")]属性,然后覆盖方法 public override void Construct(string constructString){}

B)        Pooling:类名前加属性[ ObjectPooling(true, 3,30) ],然后覆盖CanBePooled方法,public override bool CanBePooled() { return true; }

C)       JustInTimeActivation :加属性[ JustInTimeActivation(true) ]

 

5. 编译和分发

a)        组件注册

[assembly: ApplicationName("MydotNetCOMApp")]

[assembly: ApplicationActivation(ActivationOption.Library)]

b)        组件强名

[assembly: AssemblyKeyFile("keyfile.snk")]

这一步如果先产生sn.exe 产生.snk文件然后在VS.NET IDE中打开AssemblyInfo.cs,加入上面的一行似乎更方便这样就不用手工的csc编译了,VS.NET可以编译强名的Assembly。尝试使用AssemblyInfo.cs会更规范和统一。

c)         编译组件

sn -k keyfile.snk

csc /out: dbClass.dll /t:library /r:System.EnterpriseServices.dll dbClass.cs

d)        发布登记 

Regsvcs dbClass.dll Regsvcs自动调用regasm.exetlbexp.exe

 

一个大致的文件可能向下面这样,先原谅我展示了太多的属性:)

using System;

using System.EnterpriseServices; // Namespace necessary for creating COM+ application

using System.Reflection;

using System.Runtime.CompilerServices;

using System.Runtime.InteropServices;

 

[assembly: ApplicationName("COMPlusSamplesLib")]

[assembly: ApplicationActivation(ActivationOption.Library)]

 

//[assembly: AssemblyKeyFile("..//..//keyfile.snk")]

 

namespace dotCNetwork.dbClass

{

    /// <summary>

    /// Summary description for Class1.

    /// </summary>

    [ConstructionEnabled(Default="server=localhost;uid=sa;pwd=;initial catalog=pubs")]

    //[ EventTrackingEnabled ]

    [ObjectPooling(MinPoolSize=2,MaxPoolSize=50)]

    [ Transaction(TransactionOption.Required) ]

    [ Synchronization(SynchronizationOption.Required) ]

    [ JustInTimeActivation(true) ]

    [Guid("569A14C1-5DAD-4c8f-BB48-89DDD89FAD7A")]

    public class Author : ServicedComponent

    {

        private const string CONNSTRING="server=localhost;uid=sa;pwd=;initial catalog=pub";

       

        private string ConnString ;

 

        public Author()

        {

            //

            // TODO: Add constructor logic here

            //

        }

 

        //JIT/Pooling

        protected override void Activate()

        {}

        // JIT/Pooling

        protected override void  Deactivate()

        {}

       

        //JIT/Pooling

        protected override bool CanBePooled()

        { return true ; }

       

        //Construct String

        protected override void Construct(  string s )

        {

            if( s.Length== 0  || s == null)

            {

                ConnString = CONNSTRING;

            }

            ConnString = s ;

        }

 

        //my Function

        public bool alive()

        {

            try

            {

                // Commit the transaction

                ContextUtil.SetComplete();

                return true ;

            }

            catch(Exception e)

            {

                ContextUtil.SetAbort();

                return false ;

            }

        }

 

        [AutoComplete]

        public string GetConnectionStr()

        {

            return ConnString;

        }

         

    }

}

 

关于如何生成一个dotNET的组件并且注册到COM+环境中以及客户端如何调用的具体步骤和实例我就跳过了,请参照Microsoft的标准规范和建议。

 

 

(未完) 


特别:

本文优快云署名首发,转载或改编请注明作者和出处。如果有问题,请发电子邮件给new2001@msn.com

以上文字和图片涉及其他人的隐私和个人权利,所有文字和图片只用于内部交流,不作任何新闻发表和商业用途。

<think>我们正在解决.NET安装过程中出现的错误:“一个或多个要求的事务成员不存在”。根据经验,这个问题通常与Windows Installer服务、系统文件损坏或.NET Framework安装文件损坏有关。以下是逐步的解决方案: ### 步骤1:重启计算机并重试安装 有时问题可能是暂时的,重启计算机后重运行安装程序可能解决问题[^1]。 ### 步骤2:运行Windows Installer修复工具 1. 按`Win+R`打开运行窗口,输入`services.msc`并回车。 2. 找到`Windows Installer`服务,确保其状态为“正在运行”。如果没有,右键选择“启动”。 3. 如果服务无法启动,可能需要重注册Windows Installer: - 以管理员身份打开命令提示符(CMD)。 - 依次执行以下命令: ```cmd msiexec /unregister msiexec /regserver ``` ### 步骤3:检查并修复系统文件 使用系统文件检查器(SFC)部署映像服务管理(DISM)工具修复系统文件: 1. 以管理员身份打开命令提示符。 2. 运行SFC扫描:`sfc /scannow` 3. 如果SFC无法修复,运行DISM工具: ```cmd DISM /Online /Cleanup-Image /RestoreHealth ``` 4. 完成后重启计算机,再次尝试安装.NET。 ### 步骤4:清理临时文件并重置Windows Installer缓存 1. 删除临时文件: - 按`Win+R`,输入`%temp%`并回车,删除该文件夹内所有文件。 2. 重置Windows Installer缓存: - 停止`Windows Installer`服务(在服务管理器中停止)。 - 删除`C:\Windows\Installer`文件夹中的所有文件(注意:这是系统隐藏文件夹,需要显示隐藏文件)。 - 重启动`Windows Installer`服务。 ### 步骤5:手动下载.NET安装包 从微软官方下载中心重下载.NET Framework安装程序,确保文件完整[^2]。 ### 步骤6:使用.NET修复工具 下载并运行微软官方的.NET Framework修复工具(Microsoft .NET Framework Repair Tool),它可以自动检测修复常见的.NET安装问题[^3]。 ### 步骤7:检查事件查看器 如果上述步骤无效,检查Windows事件查看器(Event Viewer)中的应用程序日志,查找与安装失败相关的详细错误信息,以便进一步排查。 ### 总结 通过以上步骤,大多数情况下可以解决“.NET安装错误:一个或多个要求的事务成员不存在”的问题。如果问题仍然存在,可能需要考虑系统还原或重装操作系统。 §§相关问题§§ 1. 如何手动卸载已损坏的.NET Framework版本? 2. Windows Installer服务无法启动怎么办? 3. 如何使用DISM工具修复Windows系统镜像?</think>### 解决.NET安装错误"一个或多个要求的事务成员不存在"的方法 该错误通常由 Windows Installer 服务异常、系统文件损坏或安装包不完整引起,以下是系统性的解决方案: #### 1. **重启Windows Installer服务** - 按 `Win+R` 输入 `services.msc` - 找到 **Windows Installer** 服务 - 右键选择 **重启动** - 若服务被禁用,改为**自动**启动类型并启动[^1] #### 2. **修复系统文件** ```cmd :: 以管理员身份运行CMD sfc /scannow DISM /Online /Cleanup-Image /RestoreHealth ``` 完成后重启系统,再次尝试安装.NET[^2] #### 3. **清理安装缓存** ```cmd net stop msiserver rd /s /q %windir%\Installer reg delete HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer /f net start msiserver ``` #### 4. **重置.NET安装状态** - 下载 [.NET Framework Cleanup Tool](https://github.com/microsoft/dotnet-framework-cleanup) - 选择对应的.NET版本执行清理 - 重启后重运行安装程序 #### 5. **手动安装依赖项** ```powershell # 安装Windows更依赖 Install-WindowsFeature Net-Framework-Core -Source "D:\sources\sxs" ``` > 需指定Windows安装镜像中的`sxs`文件夹路径 #### 6. **修复注册表权限** ```cmd secedit /configure /cfg %windir%\inf\defltbase.inf /db defltbase.sdb /verbose ``` #### 7. **使用离线安装包** - 从[微软官网](https://dotnet.microsoft.com/download/dotnet-framework)下载离线安装包 - 断开网络后运行安装(避免在线验证失败) > ⚠️ 若仍失败,检查事件查看器(`eventvwr.msc`)中 **Application** 日志的详细错误代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值