COM 相互運用機能を介して VBScript (クラシック ASP) からアクセスしている .NET アセンブリがあります。1 つのクラスには、次の属性をインデクサーに追加することで VBScript から動作するようになったインデクサー (別名既定のプロパティ) があります[DispId(0)]
。ほとんどの場合は機能しますが、別のオブジェクトのメンバーとしてクラスにアクセスする場合は機能しません。
次の構文で動作させるにはどうすればよいですか:どこで Member にインデクサーがありますか (組み込みの:Parent.Member("key")
の既定のプロパティにアクセスするのと同様です)?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);
};