Tôi có một assembly .NET mà tôi đang truy cập từ VBScript (ASP cổ điển) thông qua COM interop. Một lớp có một trình chỉ mục (thuộc tính mặc định a.k.a.) mà tôi đã làm việc từ VBScript bằng cách thêm thuộc tính sau vào chỉ mục: [DispId(0)]
. Nó hoạt động trong hầu hết các trường hợp, nhưng không phải khi truy cập vào lớp như là một thành viên của một đối tượng khác.Tại sao trình lập chỉ mục trên thành phần .NET của tôi không phải lúc nào cũng có thể truy cập được từ VBScript?
Tôi làm cách nào để nó hoạt động với cú pháp sau: Parent.Member("key")
trong đó Thành viên có trình chỉ mục (tương tự như truy cập thuộc tính mặc định của built-in Request.QueryString
: Request.QueryString("key")
)?
Trong trường hợp của tôi, có một lớp cha TestRequest
với thuộc tính QueryString
trả về một IRequestDictionary
, có trình chỉ mục mặc định.
VBScript ví dụ:
Dim testRequest, testQueryString
Set testRequest = Server.CreateObject("AspObjects.TestRequest")
Set testQueryString = testRequest.QueryString
testQueryString("key") = "value"
Các dòng sau gây ra một lỗi thay vì in ấn "giá trị". Đây là cú pháp Tôi muốn được làm việc:
Response.Write(testRequest.QueryString("key"))
Microsoft VBScript runtime (0x800A01C2)
Sai số của các đối số hoặc chuyển nhượng bất động sản không hợp lệ: 'QueryString'
Tuy nhiên, sau đây các dòng do hoạt động mà không có lỗi và xuất "giá trị" mong đợi (lưu ý rằng dòng đầu tiên truy cập vào trình chỉ mục mặc định trên biến tạm thời):
Response.Write(testQueryString("key"))
Response.Write(testRequest.QueryString.Item("key"))
Dưới đây là các giao diện và lớp học được đơn giản hóa trong C# 2.0. Chúng đã được đăng ký qua 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; }
}
}
Tôi đã thử nghiên cứu và thử nghiệm các tùy chọn khác nhau nhưng chưa tìm được giải pháp. Bất kỳ trợ giúp nào cũng sẽ được đánh giá cao để tìm ra lý do tại sao cú pháp testRequest.QueryString("key")
không hoạt động và cách làm cho nó hoạt động.
Lưu ý: Đây là lần theo dõi Exposing the indexer/default property via COM Interop.
Cập nhật: Dưới đây là một số các IDL tạo ra từ các thư viện kiểu (sử dụng 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);
};
tôi cũng có vấn đề này và đã dành nhiều giờ cố gắng để giải quyết nó, không ai có bất cứ lời khuyên tốt ở đây? – MJJames