将一个相当简单的C#类库转换为COM对象?

这是我的问题:我必须从一个返回复杂数据类型的经典ASP页面调用带有安全头的Web服务。 由于有关第三方工具的各种原因,它必须是经典的ASP。 我们决定创建一个外部dll来做这个 – 我做了(在c#中),所以它返回一个数据集(Something ASP可以理解)。 但是现在我需要将该函数公开给ASP页面。 因为这是经典的ASP,我认为唯一直接的方法是将此类库公开为COM对象。 我需要知道完成此任务的最简单和最简单的方法。 我该怎么处理我的dll?

我之前从未创建过COM对象。 有人说我的class级必须是静态的,我不能有一个构造函数。 这是真的? 有人可以为我布置步骤吗?

救命! (O:

编辑:这个特定问题现在已经解决,但罗伯特罗斯尼指出我无法对经典ASP中的DataSet做任何事情。 这让我在这里发布了第二个关于实现XmlTextWriter的问题 – 罗伯特,如果你看到这个我觉得你真的可以帮忙!

不,那(静态/无ctor)不是真的。 事实上,恰恰相反,因为COM需要创建一个实例! 您只需要使类COM可见。 主要是,这只是添加一些属性,并将其注册为COM DLL(regasm)。

http://msdn.microsoft.com/en-us/library/zsfww439.aspx

创建一个返回DataSet的类并不那么困难:

using System; using System.Data; using System.Runtime.InteropServices; namespace COMTest { [Guid("AC4C4347-27EA-4735-B9F2-CF672B4CBB4A")] [ComVisible(true)] public interface ICOMTest { [ComVisible(true)] DataSet GetDataSet(); } [Guid("CB733AB1-9DFC-437d-A769-203DD7282A8C")] [ProgId("COMTest.COMTest")] [ComVisible(true)] public class COMTest : ICOMTest { public DataSet GetDataSet() { DataSet ds = new DataSet("COMTest"); return ds; } } 

}

您需要在Project属性中选中“Register for COM Interop”框,您还需要对程序集进行签名,并且您需要确保IIS用户可以访问bin\Debug目录。

完成此操作后,您可以从ASP创建一个实例:

 <% Dim o Set o = Server.CreateObject("COMTest.COMTest") Response.Write("Server.CreateObject worked.") Response.Write("
") Dim ds Set ds = o.GetDataSet() If Not ds is Nothing Then Response.Write("o.GetDataSet returned an object. Can we use it?") Response.Write("
") Response.Write("We have a DataSet, and its DataSetName is: ") Response.Write(ds.DataSetName) End If %>

在这里你会伤心的。 虽然返回DataSet的方法对COM是可见的,但DataSet的属性或方法都不是。

有人说我的class级必须是静态的,我不能有一个构造函数。 这是真的?

COM类需要有一个默认构造函数,客户端在调用CoCreateInstance时将使用它。 创建对象后,您可以在其上设置属性,或调用其他方法。

这类似于.Net处理可序列化对象的方式……使用默认构造函数构造它,然后设置其所有属性。 (如果您喜欢RAII,那么COM和.Net都会运气不好。克服它;)

至于静态评论,不,这不是真的,正如马克指出的那样。