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

问题描述:

这是我的问题:我必须从经典的ASP页面调用带有安全头部的Web服务,该页面会返回复杂的数据类型。由于涉及第三方工具的各种原因,它必须是传统的ASP。我们决定创建一个外部dll来做到这一点 - 我这样做(在c#中),以便它返回一个数据集(ASP可以理解的东西)。但是现在我需要将该函数暴露给ASP页面。因为这是传统的ASP,我认为唯一直接的方法就是将这个类库公开为COM对象。我需要知道完成这项任务的最简单的方法。我必须对我的DLL做什么?

我从来没有创建一个COM对象才使用。有人说我的课必须是静态的,我不能有一个构造函数。这是真的?有人可以为我设计步骤吗?将相当简单的C#类库转换为COM对象?

帮助! (o:

编辑:现在解决了这个特定的问题,但是罗伯特·罗斯尼指出我不能用经典ASP中的DataSet做任何事情,这导致我发布第二个问题here关于实现XmlTextWriter - 罗伯特如果你看到这个我认为你真的可以帮助!

不,那(static/no ctor)不是真的。事实上,事实上,因为COM需要创建一个实例! COM可见。主要是,这只是添加一些属性,并将其注册为COM DLL(regasm)。

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

+0

我的默认构造函数可以有吗?例如,我希望他们篡改将在wse安全头中使用的用户名和密码,然后调用相应的函数来获取他们所需的响应。 – silverbugg 2008-11-14 23:49:59

+0

没有。添加一个'init'方法来提供用户和pwd给你的班级。 – gbjbaanb 2008-11-15 01:22:09

+0

我的所有领域都必须是公开的,还是可以通过公共属性公开我的领域以保持适当的数据隐藏? – silverbugg 2008-11-17 19:03:24

创建返回一个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; 
     } 
    } 

}

你需要检查“注册为COM Interop”框在项目属性,您还需要签署大会,并且您需要确保IIS用户可以访问您的bin\Debug目录。

一旦你做到了这一点,你可以从ASP就好创建一个实例:

<% 
Dim o 
Set o = Server.CreateObject("COMTest.COMTest") 
Response.Write("Server.CreateObject worked.") 
Response.Write("<br/>") 
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("<br/>") 
    Response.Write("We have a DataSet, and its DataSetName is: ") 
    Response.Write(ds.DataSetName) 
End If 
%> 

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

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

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

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

至于静态评论,不,这是不正确的,就像Marc指出的那样。