CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

能否用c#编写com+组件?

楼主graygu(graygu)2002-11-26 04:35:39 在 .NET技术 / C# 提问

能否用c#编写com+组件? 问题点数:20、回复次数:5Top

1 楼saucer(思归)回复于 2002-11-26 04:47:46 得分 10

yes,   see  
  Building   a   complete   COM+   Server   component   using   C#   and   .NET  
  http://my.execpc.com/~gopalan/dotnet/complus/complus.net_accountmanager.htmlTop

2 楼robinswan()回复于 2002-11-26 05:31:57 得分 0

既然是用C#了,何必做Com了?   做成.Net组件不好吗?Top

3 楼lylhyh(大木鱼)回复于 2002-11-26 10:04:46 得分 0

微软软件的向下兼容性!!!Top

4 楼graygu(graygu)回复于 2002-11-26 23:08:26 得分 0

I   know   writing   .Net   components   is   much   easier   than   writing   com+,   but   how   is   the   performance?    
  Top

5 楼blacat27(春)回复于 2002-12-25 11:06:23 得分 10

.NET技术是微软大力推广的下一代平台技术,自从.NET技术架构Beta2版本的正式发布,此项技术也逐渐走向成熟和稳定。按照微软的平台系统  
   
  占有率,我们不难想象得到,在未来的一两年内.NET技术必定会势如破竹一般的登上主流的技术平台,而一个新的技术平台得以快速发展的最  
   
  重要的前提是:他不会彻底的摒弃以前的技术,这一点对于.NET技术来说指的就是COM/COM+技术了。  
   
  一般来说,在IT技术界以及硬件产业,技术的更新换代速度非常得惊人,而惯例是所有的新技术都会遵循向下兼容的原则,但是.NET技术不仅  
   
  仅做到了这一点,.NET甚至实现了相互之间的各自调用,这一点是非常难能可贵的。也就是说,不但我们可以在.NET组件中调用COM组件,同时  
   
  也可以在COM组件中正常的调用.NET组件。这点带来的好处是显而易见的,一方面我们可以保持现有的技术资源,另一方面,在现有资源中可以  
   
  利用.NET所带来的各种新技术。    
         
      一般的数据库事务控制要求事务里所做的操作必须在同一个数据库内,这样在出现错误的时候才能回滚(RllBack)到初始状态。这就存在一  
   
  个问题,在分布式应用程序中,我们往往需要同时操作多个数据库,使用数据库本身的事务处理,很难满足程序对事务控制的要求。在COM+中  
   
  ,提供了完整的事务服务,我们可以利用它来完成在分布式应用程序中的事务控制。    
         
      具体过程如下    
   
      一:用VS.NET生成一个类库   。    
      二:添加对System.EnterpristServices的引用,具体步骤          
      菜单:(项目-添加引用-在.NET选项卡选择System.EnterpristServices-确定)    
      三:构建类    
      1:源程序          
      using   System;          
      using   System.EnterpriseServices;          
      using   System.Data.SqlClient;          
      using   System.Reflection;          
      namespace   COMPlusSamples          
      {          
        //表明需要事务支持          
        [   Transaction(TransactionOption.Required)   ]          
        //声明为服务器应用程序,还可以选择Library,表示为库应用程序          
        [assembly:   ApplicationActivation(ActivationOption.Server)]          
        //描述信息          
      [assembly:   Description("sample")]          
        public   class   TxCfgClass   :   ServicedComponent          
        {          
        private   static   string   init1   =   "user   id=sa;password=;initial   catalog=pubs;data   source=(local)";              
      private   static   string   init2   =   "user   id=sa;password=;initial   catalog=NorthWind;data   source=(local)";    
      private   static   string   add1   =   "insert   into   authors('au_lname','au_fname')   values('test1',   'test2')";    
      private   static   string   add2   =   "insert   into   sample   values('test1',22)";    
        //the   error   sql   statement          
        //there   is   not   table   “sample”      
        public   TxCfgClass()   {}    
        private   void   ExecSQL(string   init,   string   sql)    
        {    
        SqlConnection   conn   =   new   SqlConnection(init);    
        SqlCommand   cmd   =   conn.CreateCommand();    
        cmd.CommandText   =   sql;    
        conn.Open();    
        cmd.ExecuteNonQuery();    
        conn.Close();    
        }    
         
         
         
        //添加一条记录到数据库    
         
        public   void   Add()          
        {          
        try          
        {          
        //在一数据库中插入一条记录                  
        ExecSQL(init1,   add1);          
        Console.WriteLine("the   operation   in   the   same   database   completely");      
        //在另外一个数据库中插入两条记录          
        //这次执行的是一个错误的SQL语句            
        ExecSQL(init2,   add2);          
        Console.WriteLine("the   operation   in   the   other   database   completely");          
        Console.WriteLine("Record(s)   added,   press   enter...");          
        Console.Read();          
        }          
        catch(Exception   e)          
        {          
        //事务回滚    
         
      ContextUtil.SetAbort();    
         
        Console.WriteLine("Because   there   are   some   errors   in   the   operation   ,so   transcation   abort");    
         
        Console.WriteLine("The   error   is   "   +   e.Message);    
         
        Console.WriteLine("abort   successfully");    
         
        Console.Read();    
         
        }    
         
        }    
         
        }    
         
      }    
         
      2:程序说明:    
         
      添加命名空间   using   System.EnterpriseServices;因为本程序使用了其中的ContextUtil类    
         
      [   Transaction(TransactionOption.Required)   ]   说明DLL需要事务支持    
         
        本程序的TxCfgClass   类从ServicedComponent类中继承,这样并不会影响该类,而只是在该类中添加了两个额外的方法,这两个方法可以使  
   
  代码共享变得更加容易    
         
        程序使用的sql   server数据库在本机运行,init1   和   init2是两个连接数据库的连接字符串,init连接pubs数据库,inin2连接northwind数  
   
  据库,这是sql2000中自带的示例数据库。add1和add2是两条sql语句,作用是分别向两个数据库的表里添加一条记录。注意:add2是一条错误  
   
  的语句,因为根本没有sample表,这样,会在执行时引起异常。(这正是我们所期望的)    
         
        在执行到add2语句时,由于它是错误的,所以会引发异常,转到错误处理语句里来执行。    
         
        ContextUtil.SetAbort();该语句使所有的数据库操作回滚,这样add1语句所插入的记录也将不存在。(达到预期目标)    
         
         
         
      四:给程序添加强名(strong   name)    
         
        1:创建一对密钥    
         
        用来创建密钥的工具是称为sn.exe的共享工具。通常通过命令提示运行它,该工具可执行各种任务以生成并提取密钥。我们需要用以下方式  
   
  来运行sn.exe。    
         
        sn   –k   key.snk    
         
        其中key.snk   代表将保存密钥的文件的名称。它的名称可以是任意的,不过习惯上带有.snk后缀名。    
         
        2:签名    
         
        签名通常是在编译时进行的。签名时,用户可利用C#属性通知编译器应该使用正确的密钥文件对DLL进行签名。要做到这一点用户需要打开  
   
  工程中的AssemblyInfo.cs文件并进行修改。    
         
        [assembly:AssemblyKeyFile(“..\\..\\key.snk”)]    
         
        注:key.snk文件和项目文件在同一个文件夹    
         
         
         
      五:编译成DLL   (具体步骤)    
         
        菜单:(生成-生成)    
         
        如果一切正常,就会生成DLL文件    
         
         
         
      六:使用regsvcs.exe将Dll注册到COM+   Services里面    
         
        我们需要用以下方式运行regsvcs.exe    
         
        regsvcs   dll文件名    
         
        如果一切正常的话,regsvcs.exe就会把dll输入到COM+   Services中。    
         
         
         
      至此,我们已经生成并注册了这个可以由其它程序使用的类,现在,我们来写一个控制台程序来检验这个类是否正常运行    
         
         
         
      七:构建客户机    
         
      1:新建控制台应用程序项目    
         
      菜单(文件-新建-项目)    
         
        选择控制台应用程序   ,并选择   添入解决方案   ,确定    
         
        2:同上面的第二步一样,添加对System.EnterpriseServices的引用。    
         
        3:添加对自己刚才做好的类的引用。    
         
        菜单(项目-添加引用-浏览),选择刚才生成的DLL,确定    
         
        4:输入以下程序    
         
        using   System;    
         
      using   COMPlusSamples;    
         
      using   System.EnterpriseServices;    
         
         
         
      public   class   Client    
         
      {    
         
        public   static   void   Main()    
         
        {    
         
        TxCfgClass   cfg   =   new   TxCfgClass();    
         
        cfg.Add();    
         
        }    
         
      }    
         
         
         
        5:将控制台程序设置为启动项,然后编译运行,就会看到结果。    
         
        正如我们希望的,第一条记录没有插入数据库Top

相关问题

  • 关于C#编写的组件
  • c#中能否调用JAVAz组件?
  • VS C#.net如何编写调用COM组件的程序?
  • C++Bulider组件中的OnDataReceive事件的编写---在线等候
  • 用C#编写组件com+程序失败!
  • 用C#编写WEB下应用打印组件
  • 各位高手请高在C#中编写组件怎么写!
  • 如何用C#编写asp(不是asp.net)使用的dll组件。
  • 请教如何使用C#编写标准COM组件
  • 编写组件的时候能否使用DFM文件中的描述作为组件的对象?

关键词

  • .net
  • .net技术
  • c#
  • 组件
  • 语句
  • 应用程序
  • 数据库
  • 技术
  • 控制台
  • 文件

得分解答快速导航

  • 帖主:graygu
  • saucer
  • blacat27

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo