将相当简单的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)。
创建返回一个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指出的那样。
我的默认构造函数可以有吗?例如,我希望他们篡改将在wse安全头中使用的用户名和密码,然后调用相应的函数来获取他们所需的响应。 – silverbugg 2008-11-14 23:49:59
没有。添加一个'init'方法来提供用户和pwd给你的班级。 – gbjbaanb 2008-11-15 01:22:09
我的所有领域都必须是公开的,还是可以通过公共属性公开我的领域以保持适当的数据隐藏? – silverbugg 2008-11-17 19:03:24