Robin's Blog

记录 积累 学习 成长

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 

PAUSE 
sn -k keyfile.snk   
PAUSE 
tlbexp STCOM.dll /out:STCOM.tlb  
PAUSE 
D:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm /tlb:STCOM.tlb STCOM.dll   
PAUSE 
gacutil -i STCOM.dll  
PAUSE 

COM 类示例(C# 编程指南)

下面是一个公开为 COM 对象的类的示例。将这段代码放置在 .cs 文件中并添加到项目后,请将“为 COM Interop 注册”属性设置为“True”。有关更多信息,请参见如何:为 COM Interop 注册组件

向 COM 公开 Visual C# 对象要求声明一个类接口、一个事件接口(如果需要)和类本身。类成员必须遵循下列规则才能对 COM 可见:

  • 类必须是公共的。

  • 属性、方法和事件必须是公共的。

  • 属性和方法必须在类接口上声明。

  • 事件必须在事件接口中声明。

其他没有在这些接口中声明的类的公共成员对于 COM 是不可见的,但它们对于其他 .NET Framework 对象将是可见的。

若要向 COM 公开属性 (Property) 和方法,必须在类接口上声明这些属性 (Property) 和方法,并用 DispId 属性 (Attribute) 予以标记,然后在类中实现它们。成员在接口中声明的顺序即是用于 COM vtable 的顺序。

若要从类中公开事件,必须在事件接口上声明这些事件,并用 DispId 属性予以标记。该类不应实现此接口。

类实现类接口;它可以实现多个接口,但第一个实现将作为默认类接口。在此处实现向 COM 公开的方法和属性。它们必须标记为是公共的,并且必须与类接口中的声明匹配。同时,在此处声明由类引发的事件。它们必须标记为是公共的,并且必须与事件接口中的声明匹配。

有关更多信息,请参见“COM Interop 第一部分”示例“COM Interop 第二部分”示例和 COM 互操作性示例

C#
using System.Runtime.InteropServices;
namespace project_name
{
[Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")]
public interface ComClass1Interface
{
}
[Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA71"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ComClass1Events
{
}
[Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938"),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(ComClass1Events))]
public class ComClass1 : ComClass1Interface
{
}
}

    这里我们将介绍.NET中的C#编写COM组件的几种方法,希望通过本文能对大家了解COM组件有所帮助。

    我们将介绍C#编写COM组件的几种方法,并通过代码讲解的相识,对.NET中的C#编写COM组件进行详细的介绍。包括生成.NET程序集,注册并创建一个程序库等等。

    1. Encrypt( string pToEncrypt,string sKey ) //加密  
    2. Decrypt( string pToDecrypt,string sKey ) //解密 

    然后你这样写代码:

    1. using System;  
    2. using System.Runtime.InteropServices;  
    3. namespace 名称空间  
    4. {  
    5.     // 首先建立接口,这个是Com必须使用的  
    6.     [Guid( "61BB24CB-4C2C-40f8-9E13-1AC5E558D56A" )]  
    7.     public interface IEncrypt  
    8.     {  
    9.         string Encrypt( string pToEncrypt,string sKey );  
    10.         string Decrypt( string pToDecrypt,string sKey );  
    11.     }  
    12.     // 写接口的实现  
    13.     [Guid( "CB52E990-185E-4448-A7E8-C88ECAD563AB" )]  
    14.     public class 类名称 : IEncrypt  
    15.     {  
    16.         public string Encrypt( string pToEncrypt,string sKey )  
    17.         {  
    18.             // 复制FAQ加密代码  
    19.         }  
    20.         public string Decrypt( string pToDecrypt,string sKey )  
    21.         {  
    22.             // 复制FAQ解密代码  
    23.         }  
    24.     }  

    然后用vs.net打包成.dll类库文件,假设名称为MyEncrypt.dll

    然后用如下工具

    regasm MyEnCrypt.dll /tlb:MyEncrypt.tlb

    上面的方法貌似不行,以下命令可以生成tlb

    tlbexp MyEnCrypt.dll /MyEnCrypt.tlb

    这个.tlb文件就是类型库,可以由vb6和vc++6引用.

    注意上面的guid是使用vs.net工具菜单里面的创建guid工具生成的.

    还要注意,vs.net自动生成的assemblyinfo.cs文件中必须添加强名称和版本号,因为Com组件需要版本号,不要改动版本号,也不要用vs.net自动的1.*这样的版本号,最好使用

    1.1.1.1这样的固定版本,而且必须一次添加,不能多次添加.

    步骤

    一 生成.net程序集:

    首先你把http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=35935的代码复制.

    然后你复制这个代码

    1. using System;  
    2. using System.IO;  
    3. using System.Text;  
    4. using System.Runtime.InteropServices;  
    5. using System.Security.Cryptography;   
    6. namespace Csic  
    7. {  
    8.     // 首先建立接口,这个是Com必须使用的  
    9.     [Guid( "61BB24CB-4C2C-40f8-9E13-1AC5E558D56A" )]  
    10.     public interface IEncrypt  
    11.     {  
    12.         string Encrypt( string pToEncrypt,string sKey );  
    13.         string Decrypt( string pToDecrypt,string sKey );  
    14.     }  
    15.     // 写接口的实现  
    16.     [Guid( "CB52E990-185E-4448-A7E8-C88ECAD563AB" )]  
    17.     public class Crypt : IEncrypt  
    18.     {  
    19.         public string Encrypt( string pToEncrypt,string sKey )  
    20.         {  
    21.             // 复制FAQ加密代码  
    22.         }  
    23.         public string Decrypt( string pToDecrypt,string sKey )  
    24.         {  
    25.             // 复制FAQ解密代码  
    26.         }  
    27.     }  

    把上面的文件保存成vs.net项目的一个类库工程.

    然后使用vs.net的“Vsitual Studio .Net工具”-->Vistual Studio .Net命令提示符

    在命令行内打下

    1. cd c:\ <回车> 
    2. sn -k myKey.snk<回车> 

    就在C盘根目录下生成一个名叫myKey.snk的强名称文件,然后关闭提示符窗口.

    在vs.net的那个类库工程自动生成的AssemblyInfo.cs文件内把

    1. [assembly: AssemblyKeyFile( "" )]  

    改成

    1. [assembly: AssemblyKeyFile( @"C:\myKey.snk" )]  

    把[assembly: AssemblyVersion( "1.0.*" )]

    改成

    1. [assembly: AssemblyVersion( "1.0.0.0" )] // 注意:这时你的Com组件版本为1.0.0.0版  

    然后按Shift + Ctrl + B键生成dll库(使用Release模式),假设是Csic.Crypt.dll.

    这时候,程序集就建立成功了.

    二、注册该程序集并创建一个类型库

    仍然使用开始菜单中的Vistual Studio .Net命令提示符

    进入你的项目目录,假设为D:\myProject\bin\Release

    在对话框中输入

    1. d:<回车> 
    2. cd myproject\bin\release<回车> 

    然后输入 dir 命令可以看见Csic.Crypt.dll文件

    然后输入:regasm /tlb Csic.Crypt.tlb Csic.Crypt.dll<回车>

    然后就在这个目录下生成了Csic.Crypt.tlb类型库文件.不要关闭此提示符窗口.

    这时候,这个.dll的.net程序集就变成一个标准的Com组件了,但是还不能用,必须让它变成全局Com组件.

    这个regasm 实用程序将创建一个类型库并在 Windows 注册表中对其进行注册,以使 PhysServer2.dll 中的类对 COM 客户端可用 .

    三、 将程序集添加到全局程序集缓存中

    进入提示符窗口,输入

    1. gacutil /I Csic.Crypt.dll<回车>  

    这时,你的这个dll就被复制到全局程序集缓存中了.也就是说无论在这个电脑的哪个硬盘上都可以使用此dll组件了.

    四、C#编写COM组件使用方法

    asp内的使用方法

    1. set obj = Server.CreateObject( "Csic.Crypt" )  
    2. dim str1  
    3. str1 = obj.Encrypt( "要加密内容","密码" ) // 加密  
    4. dim str2  
    5. str2 = obj.Decrypt( "要解密内容","密码" ) // 解密 
posted on 2010-04-15 11:39  Robin99  阅读(2689)  评论(0编辑  收藏  举报