如何将参数从经典ASP传递到com组件

本文关键字:com 组件 ASP 经典 参数 | 更新日期: 2023-09-27 17:59:29

我正在开发一个需要许多参数的asp.net组件。它将从经典的ASP调用。我当然可以通过10-20个参数,但我想更整洁一点。

我很有信心我可以在一个数组中通过,但理想情况下我希望能够在一个对象中通过。

这可能吗?

我决定做一个小测试。经典ASP:

Dim objDictionary
Set objDictionary = CreateObject("Scripting.Dictionary")
objDictionary.Add "startDate", startDate
objDictionary.Add "endDate", endDate
MyComponent.checkObj(objDictionary)

在我的ASP.net组件中,我有:

   public string checkObj(object config)
    {
        return "StartDate is " + config.startDate;
    }

编辑:

我已经解决了这个问题,所以我要改变这一点:我创建了一个抽象类,现在它正在对照它进行检查,并完美地构建。在运行时,我现在得到一个错误-Microsoft VBScript运行时错误:无效的过程调用或参数:"checkObj"。

是否可以将集合传递到com程序集中?

也许问题是com组件正在接收Scripting.Dictionary类型的对象,而不是我创建的抽象类,但这样的东西在.net中不存在?

如何将参数从经典ASP传递到com组件

您可以尝试在asp页中使用.net对象,如System.Collections.ArrayList或System.Collections.Hashtable,而不是该字典。。。

<%@ LANGUAGE="VBSCRIPT" %>
<%
dim netObj    
set netObj = server.createobject("System.Collections.Hashtable")
' or:
'set netObj = server.createobject("System.Collections.ArrayList")
%>

这应该会让你的.net组件变得更容易

我想做一些类似的事情,所以为.NET DataRow创建了一个包装器类。如果你愿意,你可以使用HasTable/DDictionairy/Other Custom Implementation作为你的后备存储。

我在包装器对象上使用Indexer属性来公开我的"属性",所以在asp classic中使用属性看起来是这样的:

Dim lngCustomerId
lngCustomerID = CLng(objectWrapper("CustomerId"))

我使用COM注册的.NET程序集公开包装。我的包装器继承自DynamicObject,并通过COM可见接口公开以下内容:

[ComVisible(true)]
[Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IDynamicModel
{
    dynamic this[string propertyName] { get; set; }
    bool TryGetMember(GetMemberBinder binder, out object result);
    bool TrySetMember(SetMemberBinder binder, object value);
}

我认为TryGetMemberTrySetMember对于您的需求是不必要的。

我的包装器类实现如下所示:

[ComVisible(true)]
[Guid("YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY")]
[ProgId("COMLIB.DynamicModel")]
[ClassInterface(ClassInterfaceType.None)]
public sealed class DynamicModel : DynamicObject, IDynamicModel
{
    #region indexer
    public dynamic this[string propertyName]
    {
        get
        {
            dynamic propertyValue;
            if (TryGetMember(propertyName, out propertyValue) != true)
            {
                propertyValue = null;
            }
            return propertyValue;
        }
        set
        {
            if (TrySetMember(propertyName, value) != true)
            {
                throw new ArgumentException("Cannot set property value");
            }
        }
    }
    #endregion indexer

    #region Fields
    private DataRow dataRow;
    #endregion Fields

    #region Properties
    public dynamic GetAsDynamic { get { return this; } }
    #endregion Properties

    #region CTOR Methods
    public DynamicModel()
        : base()
    {
        DataTable dataTable = new DataTable();
        this.dataRow = dataTable.NewRow();
    }
    public DynamicModel(DataRow dataRow)
        : base()
    {
        this.dataRow = dataRow;
    }
    #endregion CTOR Methods

    #region Dynamic Object Member Overrides
    public override bool TryGetMember(GetMemberBinder binder, out object columnValue)
    {
        bool result = false;
        columnValue = null;
        result = TryGetMember(binder.Name, out columnValue);
        return result;
    }
    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        bool result = false;
        result = TrySetMember(binder.Name, value);
        return result;
    }
    #endregion Dynamic Object Member Overrides

    #region Operations
    public bool TryGetMember(string columnName, out dynamic columnValue)
    {
        bool result = false;
        columnValue = null;
        if (dataRow != null && dataRow.Table.Columns.Contains(columnName))
        {
            columnValue = dataRow[columnName];
            result = true;
        }
        return result;
    }
    public bool TrySetMember(string columnName, dynamic columnValue)
    {
        bool result = false;
        if (dataRow != null && dataRow.Table.Columns.Contains(columnName) == true)
        {
            dataRow[columnName] = columnValue;
            result = true;
        }
        else
        {
            Type type = columnValue.GetType();
            DataColumn dataColumn = new DataColumn(columnName, type);
            result = TrySetDataColumn(dataColumn, type, columnValue);
        }
        return result;
    }
    private bool TrySetDataColumn(DataColumn dataColumn, Type type, object value)
    {
        bool result = false;
        dataRow.Table.Columns.Add(dataColumn);
        result = TrySetMember(dataColumn.ColumnName, value);
        return result;
    }
    #endregion Operations
}

我希望这能有所帮助。