我有一个 .NET 程序集,我通过 COM 互操作从 VBScript(经典 ASP)访问它。一个类有一个索引器(也称为默认属性),我通过向索引器添加以下属性从 VBScript 中得到它:[DispId(0)]
. 它在大多数情况下都有效,但在作为另一个对象的成员访问该类时无效。
我怎样才能让它使用以下语法:Parent.Member("key")
其中 Member 有索引器(类似于访问内置Request.QueryString
:的默认属性Request.QueryString("key")
)?
在我的例子中,有一个父类TestRequest
的QueryString
属性返回一个IRequestDictionary
,它具有默认索引器。
VBScript 示例:
Dim testRequest, testQueryString
Set testRequest = Server.CreateObject("AspObjects.TestRequest")
Set testQueryString = testRequest.QueryString
testQueryString("key") = "value"
以下行导致错误而不是打印“值”。这是我想要使用的语法:
Response.Write(testRequest.QueryString("key"))
Microsoft VBScript 运行时 (0x800A01C2)
参数数量错误或属性分配无效:“QueryString”
但是,以下行确实可以正常工作并输出预期的“值”(请注意,第一行访问临时变量上的默认索引器):
Response.Write(testQueryString("key"))
Response.Write(testRequest.QueryString.Item("key"))
下面是 C# 2.0 中的简化接口和类。他们已通过以下方式注册RegAsm.exe /path/to/AspObjects.dll /codebase /tlb
:
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IRequest {
IRequestDictionary QueryString { get; }
}
[ClassInterface(ClassInterfaceType.None)]
public class TestRequest : IRequest {
private IRequestDictionary _queryString = new RequestDictionary();
public IRequestDictionary QueryString {
get { return _queryString; }
}
}
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IRequestDictionary : IEnumerable {
[DispId(0)]
object this[object key] {
[DispId(0)] get;
[DispId(0)] set;
}
}
[ClassInterface(ClassInterfaceType.None)]
public class RequestDictionary : IRequestDictionary {
private Hashtable _dictionary = new Hashtable();
public object this[object key] {
get { return _dictionary[key]; }
set { _dictionary[key] = value; }
}
}
我已经尝试研究和尝试各种选项,但还没有找到解决方案。任何帮助都将不胜感激,以找出testRequest.QueryString("key")
语法不起作用的原因以及如何使其起作用。
注意:这是通过 COM Interop 公开索引器/默认属性的后续内容。
更新:这是从类型库中生成的一些 IDL(使用oleview):
[
uuid(C6EDF8BC-6C8B-3AB2-92AA-BBF4D29C376E),
version(1.0),
custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, AspObjects.IRequest)
]
dispinterface IRequest {
properties:
methods:
[id(0x60020000), propget]
IRequestDictionary* QueryString();
};
[
uuid(8A494CF3-1D9E-35AE-AFA7-E7B200465426),
version(1.0),
custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, AspObjects.IRequestDictionary)
]
dispinterface IRequestDictionary {
properties:
methods:
[id(00000000), propget]
VARIANT Item([in] VARIANT key);
[id(00000000), propputref]
void Item(
[in] VARIANT key,
[in] VARIANT rhs);
};