如何从C#中创建的Classic ASP调用参数化函数

时间:2011-05-19 12:05:39

标签: c# com asp-classic

我在C#(框架3.5)中创建了一个dll,我已经在该dll中声明了一个参数化函数。我已经成功编译了dll。之后我创建了一个经典ASP页面,我想从这个页面调用参数化函数,产生以下错误。

Microsoft VBScript runtime (0x800A01C2) Wrong number of arguments or invalid property assignment: 'GetData'

我正在附上以下代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;

namespace SayHello
{
    [ComVisible(true)]
    public class SayHello : IMyStorage
    {
        [ComVisible(true)]
        public string GetData([In, MarshalAs(UnmanagedType.BStr)] string Name)
        {
            return "hello " + Name;
        }

        #region IMyStorage Members
        [ComVisible(true)]
        public void GetData(string name, out string helloName)
        {
            helloName = "hello " + name;
        }

        #endregion
    }

    [ComImport]
    [Guid("73EB4AF8-BE9C-4b49-B3A4-24F4FF657B26")]
    public interface IMyStorage
    {
        [DispId(1)]
        void GetData([In, MarshalAs(UnmanagedType.BStr)] String name,
           [Out, MarshalAs(UnmanagedType.BStr)] out String helloName);
    }
}

现在我粘贴了asp的代码

Dim obj
Set obj = Server.CreateObject("SayHello.SayHello") 
' Set obj = Server.CreateObject("SayHello.dll") 
' Set obj= obj.Load("SayHello.dll") 
inputStr = "myString" 
GetObj = obj.GetData(inputStr)
SET Obj = NOTHING 
Response.Write (GetObj)

请帮助我。

2 个答案:

答案 0 :(得分:2)

你非常接近。

在我看来,您对object.GetData()的调用只传递了一个参数。 同时,COMVisible对象上有两个GetData()方法。

但是COM不支持重载:两个方法具有相同的名称和不同的参数集。

COM->.NET - can't access overloaded method

如果查看生成的COM接口,其中将有两个方法,一个名为GetData,一个参数,一个名为GetData_2,需要两个。我从来没有在任何地方发现这个这正是我在像你这样的案例中所观察到的。

Overloads in COM interop (CCW) - IDispatch names include suffix (_2, _3, etc)

如果您希望这两个都可以访问,我建议您通过名称明确区分它们,而不是依赖于我描述的行为。


另外:如果您对这两种COMVisible方法保持GetData,则应将它们都包含在IMyStorage中。

答案 1 :(得分:0)

调用GetData时是不是缺少第一个参数? Microsoft VBScript运行时(0x800A01C2)参数数量错误或属性分配无效:'GetData'

GetObj = obj.GetData(inputStr)  ' where is the string name?

可能以下问题解决了这个问题:

Dim sName
GetObj = obj.GetData(sName, inputStr) 
Response.Write (inputStr)