这是一个针对问题的超时响应,但是让我解释一下我的了解。
为了理解这个问题,你需要想象一下COM和COM+应用程序之间的差异。
将您的类型注册为COM - 每次代码尝试初始化对象时都会创建对象。
将您的类型注册为COM +应用程序 - 创建对象,支持对象池,支持事务,支持增强的Windows安全性等。
为了了解对象池,我借鉴了
http://www.tek-tips.com/viewthread.cfm?qid=116249中的一个响应。
COM+ 的主要扩展性和性能增强方法是通过对象池实现的。不幸的是,这需要一个自由线程组件,这是 VB6 无法做到的。但是…… .NET(任何语言)和 C++ 可以做到。
对象池的作用是告诉 MTS/COM+ 创建一组可用对象,从 COM+ 启动时创建的最小值到某个最大值(我不知道它是否是硬限制或者是否灵活)。池化为您提供了一个经过预初始化的对象,这比等待对象被创建要快得多(特别是在网络上)。调用者连接到对象,进行方法调用,然后断开连接。对象然后返回到池中。
这确实需要对程序架构进行基本更改。在 COM+ 之前,每个人都会打开与数据库的连接,并在应用程序持续时间内保持连接处于打开状态。当用户人数少于100时,这是可以接受的,因为服务器的负载是可管理的(每个连接占用 RAM)。但是对于大量或未知数量的用户(例如来自互联网的用户),数据库服务器很快就会超载。有人意识到,每个交易用户实际上只在一小部分时间内进行真正的工作——其余时间他们处于空闲状态。
因此,您的程序必须建立连接、发出请求、获取结果,然后断开连接(这也适用于非数据库对象)。这还意味着应用程序必须是无状态的(程序状态在请求之间不保留)。因为……您当前使用的对象在 200 毫秒之前属于其他人。当您完成使用对象时,另一个用户将在您之后使用它。因此,对象不能保留任何信息——它们必须仅限于代码。
regasm - 注册一个 .net 程序集类型作为 COM 组件。这意味着 regasm 会选择你的 .Net 程序集中公开的类型,然后在 HKCR.... 写入相应的注册表项(这就是 regsvr32 的工作方式)。
- regasm 可以为您生成 tlb 文件(就像 tlbexp.exe 一样)
- regasm 可以将您的 .Net 程序集编译成 codebase。也就是说,如果您没有将 .Net 程序集安装到 GAC 中,则可以将 COM 编译成 .Net 程序集所在的文件位置。从这里开始,COM Marshaller 将使用 CLR 执行程序集。
- regasm 允许您创建一个 .reg 文件,通过双击可以更新注册表项。您必须确保 .Net 程序集已安装到 GAC 中,因为 regasm 中的 /regfile 开关不允许您 /codebase(如果它编译了 codebase,那么它就没有意义)
regsvcs - 从 .Net 程序集创建一个 COM+ 应用程序。这意味着 regsvcs 会选择你的 .Net 程序集中公开的类型,并除了写入适当的注册表项外,还创建了一个 COM+ 应用程序,您可以通过组件服务管理器控制台(%systemroot%\system32\comexp.msc)进行管理。
如果您编写了一个带有ComVisible(true)的C#类-->此类(Foo)的公共类型已准备好与regasm一起注册为COM。
// Set the COM visibility attribute to true
[ComVisibleAttribute(true)]
public class Foo{....}
如果你写了一个带有ComVisible(true)标记的C#类,并继承自System.EnterpriseServices.ServicedComponent(当然还需要进行更多设置..),那么这个类(FooBar)就可以被注册为COM+应用程序。
// Set the COM visibility attribute to true
[ComVisibleAttribute(true)]
public class FooBar: System.EnterpriseServices.ServicedComponent{.....}
从.NET创建COM+应用程序-您可以从这里开始。请记住,COM+为公开的COM对象提供高级事务管理。
http://support.microsoft.com/kb/306296
http://my.execpc.com/~gopalan/dotnet/complus/complus.net_accountmanager.html
http://www.codeproject.com/Articles/3845/Creating-COM-Objects-using-EnterpriseServices-in-N
regasm
和regsvcs
区别的最好解释。感谢您! :) - Daniel Lo Nigro