第一次用.net C#写组件,不知道如何入手
还有写好的组如何扔到服务器上给asp程序调用麻烦大家帮忙解决,急啊....

解决方案 »

  1.   

    先看下自定义控件的原理吧

    远程注册dll的方法zz
    摘要:ASP远程注册自己的组件 
     
     
    把asp程序作成dll很多好处,但是有一点,该dll必须注册才能在asp中调用。如果是自己的服务器那还好,但如果是租用的虚拟服务器,就没办法使用了。
    怎样在远程主机上注册我们的dll呢?在服务器端使用Shell!!! 让我们先将自己的dll文件通过ftp或http上传到服务器上,然后作一个asp程序,调用WScript.Shell来执行regsvr32命令:
    Set oShell = CreateObject ("WScript.Shell")
    oShell.Run "c:\WINNT\system32\regsvr32.exe /s d:\xxx.dll", 0, False
    当然如果对方的服务器安全搞的很好的话,这个代码也许就不能用了,但不管怎么样,学习一下也是好的,:)
    在这里也要提醒那些出租空间的朋友,你的服务器是否限制了使用WScript.Shell的权限?还是小心为妙完整代码如下,保存为.asp即可使用: 
     
     
      

  2.   

    C# 注册COM+组件步骤
    1) 在建立C#工程之后必须要给类一个强名称。
    要创建强名称,可以使用 sn 工具。此命令行工具有许多选项,在命令提示符处键入 sn /? 可以查看所有选项。对程序集签名所需的选项是“-k”,它将创建一个密钥文件。默认情况下,该文件使用 .snk 作为扩展名。例如,要创建一个名为 MyCom.snk 的密钥文件,可以使用以下命令行:
     sn -k MyCom.snk
    然后在工程中引用这个强名称
    方法如下:
    (1):注释掉AssemblyInfo.cs中的[assembly: AssemblyKeyFile("")]和[assembly: AssemblyKeyName("")]
    (2): 在组件类中写入
    using System.Data.OleDb;//引用ADO.net命名空间
    using System.Data;//引用数据空间
    using System.Runtime.InteropServices;//为了调用GUID
                            System.EnterpriseServices命名空间包涵所有COM+的类型库所以在编写COM+组件的时候一定要用到System.EnterpriseServices命名空间,这个命名空间在引用中.net页下可以找到
          using System.EnterpriseServices;//引用COM+名命空间
                using System.Runtime.CompilerServices;//运行时编译服务器
          using System.Reflection;//用些全局属性取得强名属性
    [assembly: ApplicationName("myCom")]
                     //强名文件名和文件属性。用sn.exe生成,用法 sn -k mycom.snk
          [assembly: AssemblyKeyFileAttribute("mycom.snk")]
    [assembly: AssemblyKeyName("mycom.snk")]
       (3)组件类的写法
    组件类的写法有二种一种是以前的那种
    一种是基于接口编程的例如
    namespace myCom//把所有代码写到相应的命名空间内
    {
    //每一个接口一个GUID号
    [Guid("549047DE-9F3B-4781-A1F6-F3C852091FC9")]
    //接口类型ComInterfaceType.InterfaceIsDual接示接口需要双重公开给COM+
    //这个属性是接口的属性
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    //定义接口
    public interface Add{
    接口内的方法返回布尔值有一个整型参数
    bool AddData(int d);bool AddDataM(int d);
    }
           //实现这个接口
    //事务属性表示需要新事务
    //这个属性用来记录类是否支持事务有车个选项同VB中类的属性相同
     [Transaction(TransactionOption.RequiresNew )]
    //在类中实现这个接口必须要继承System.EnterpriseServices;命名空间的ServicedComponent类
    //在后面继承前面所定义的接口如果有多个可以用“,”分开
     public class myClass:ServicedComponent,Add
     {
    //  public myCom.myClass   error =new ErrorsLibrary.Class1();  //定认字符变量用来存放数据库连接字符串
      private static string strConnect ="Provider=MSDAORA.1;Password=erpii;User ID=erpii;Data Source=erpii;Persist Security Info=True";
      //创建这个连接
      private OleDbConnection conConnection = new OleDbConnection ( strConnect ) ;
       
         //实现接口中的查询方法
      public bool AddData(int id)
      {
       try
       {    //string StrSql="insert into    TEST1   values( '" + id + "')";
        string StrSql=" insert into    test_d  values( '" + id + "'," 
         +"'" + id + "',"
         + "'" + id + "',"
         + "'" + id + "')";
        //     string StrSql="DELETE FROM TEST1"; 
        //找开连接
        conConnection.Open(); // 打开数据连接
        //执行查询
        OleDbCommand cmd = new OleDbCommand ( StrSql , conConnection ) ;
        cmd.ExecuteNonQuery ();
        conConnection.Close ();    //ContextUtil.SetComplete() ;
        return true;
       }
       catch (Exception e) 
       {
        
        //error.Description =e.Message;
        //    EnterpriseServices.ContexUtil.
        ContextUtil.SetAbort();
        return false;
        //    
       }
      }  public bool AddDataM(int id)
      {
       try
       {
        //    string StrSql="insert into    TEST21  values( " + id + "')";
        //    string StrSql="DELETE FROM TEST2"; 
        //找开连接
        string StrSql=" insert into    test_m  values( '" + id + "'," 
         +"'" + id + "',"
         + "'" + id + "',"
         + "'" + id + "')";
        conConnection.Open(); // 打开数据连接
        //执行查询
        OleDbCommand cmd = new OleDbCommand ( StrSql , conConnection ) ;
        cmd.ExecuteNonQuery ();
        conConnection.Close ();
        //    System.EnterpriseServices.ContextUtil.SetComplete() ;
        return true;
        
       }
       catch (Exception e) 
       {
        //error.Description =e.Message;
        //    EnterpriseServices.ContexUtil.
        //    System.EnterpriseServices.ContextUtil.SetAbort();
        //    e.Message;
        ContextUtil.SetAbort () ;
        return false;
        
       }  }
     
              //如果在方法或类上使用[AutoComplete]则事务类或方法在没有错误的情状下自动提交事务
      [AutoComplete]
      public bool addRs()
      {
           
       try
       {
        for (int i=0;i<100;i++)
        {
         ////       
         if (!AddData(i))
         {    //事务回滚
          ContextUtil.SetAbort () ;
          函数返回值
    return false;
         }
                            //如函数不等于真则回滚其中(!)相当于VB中的(NOT)
         if ( !AddDataM(i))     {
          ContextUtil.SetAbort () ;
          return false;
         }
           
        }
                       如查成功能提交事务
        ContextUtil.SetComplete(); 
        return  true;
         
       }
         
          
       
       catch (Exception e) 
       {
        //      error.Description =e.Message;
        //    EnterpriseServices.ContexUtil.
        //    ContextUtil.SetAbort();
        ContextUtil.SetAbort () ;
        return false;
        //    
       }
      }  public myClass()
      {
       //
       // TODO: 在此处添加构造函数逻辑
       //
      }
     }
    }
    2)在代码编写完成之后要注册我的组件到COM+服务器上
    (1) 首先,必须为该程序集创建一个类型库。类型库是 .NET 程序集中所包含的元数据的 COM 等效组件。类型库通常包含在扩展名为 .tlb 的文件中。类型库包含必要信息,COM 客户端使用这些信息可以确定在特定服务器中有哪些类,以及这些类支持的方法、属性和事件。.NET 框架 SDK 包含一个名为 tlbexp(类型库导出程序)的工具,它可以从程序集创建类型库。tlbexp 包含许多选项,可以在命令提示符处键入 tlbexp /? 查看所有选项。其中一个是 /out 选项,用于指定已生成的类型库的名称。(如果您不自己指定名称,将自动为您创建一个名称。)例如,要将元数据从一个名为 MyCom.dll 的程序集提取到一个名为 MyCom.tlb 的类型库中,可以使用以下命令行:
    *注意:tlbexp MyCom.dll /out:MyCom.tlb的命令中out:MyCom.tlb
    out: 和   MyCom.tlb   就是要导出的类型库文件中间一定要有一个空格
    tlbexp MyCom.dll /out:MyCom.tlb
    (2)应使用 .NET 框架 SDK 中的程序集注册工具 (regasm),通过一次操作同时完成类型库的创建和注册。这是在一台计算机上同时进行 .NET 和 COM 开发所能使用的最简单的工具。与 tlbexp 类似,regasm 有许多选项。在命令提示符处键入 regasm /?,可以查看所有选项。要使用 regasm 创建并注册一个类型库,可以使用相应的命令行,如:
    regasm /tlb:MyCom.tlb MyCom.dll
    (2) 最后我们要把我们编写好的组件放置到COM+服务器上去
    Regsvcs /c   myCom.dll
      

  3.   

    有正解了
    正巧我目前也在做,帮你顶一下吧顺便接点分
    但是我在用的时候一直有个问题,就是在组件里公布的属性在javascript里无法访问
    请问高手有解决吗