2009-12-03 16 views
16

すべての.net開発者は、プロパティの概念を知っています。 99.99%の粗いメタデータは、2つのメソッド、ゲッター、セッターを貼り付けるだけのものです。let_propertyメソッドの好奇心

通常、イベントはadd、remove、およびinvokeメソッドと同じことが起こります。

ECMA-335は、プロパティまたはイベントのいずれかに適用される«その他»の種類のメソッドセマンティックを記述します。概念的には、プロパティまたはイベントは複数の«その他»メソッドを持つことができます。

今日は私が«other»メソッドで不動産を見つけた最初の日です。もちろん、それはCOMに関連していなければなりませんでした。インタフェースEnvDTE.Propertyは、(Visual Studioのにアドインを書き込むために使用)EnvDTEアセンブリに、として定義されたプロパティが含まれている次の:

let_Valueは次のように定義された状態で
.property object Value() 
{ 
    .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = (01 00 00 00 00 00 00 00) 
    .get instance object EnvDTE.Property::get_Value() 
    .other instance void EnvDTE.Property::let_Value(object) 
    .set instance void EnvDTE.Property::set_Value(object) 
} 

どうやら
.method public hidebysig newslot specialname abstract virtual 
     instance void let_Value([in] object marshal(struct) lppvReturn) runtime managed internalcall 
{ 
    .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = (01 00 00 00 00 00 00 00) 
} 

、VBScriptのVB.NETより前のバージョンのVBでは、Letキーワードを使用してプロパティを定義できます。そしてLetはSetと同じ署名をしています。私はここに関係があると感じます。

しかし、誰もがこのプロパティはEnvDTEがで書かれている言語で宣言されている方法を知っていますか?どのようにして同じパターンのアセンブリを作成できますか(ilasmを使用しないと、それは簡単すぎるでしょう)?誰も似たような財産に直面していますか?

そして、誰もがこの1よりも多分異なるセマンティックで、他«その他»プロパティを見ているのでしょうか?そしてもしそうなら、彼らは何に慣れていますか?

答えて

21

これはVBで浮上しているCOMのものです。 Setは、プロパティの参照先項目を置換するための参照を割り当てますが、Letは、既存のプロパティにオペランドの内容をコピーすることが予想されます。 (Property Getも参照してください)。

IIRCこれはコアCOMのものではなく、言語が十分な表現力を持っていない場所で使用されているより価値のあるものを扱っています。IDispatchを使用しているとき(メソッドに解決して呼び出す必要がある)カスタムインターフェイスではなく、メソッドではなくプロパティIDでアドレス指定します。私はかなりVB.NET(または他の.NET言語)doesntの表面そのようなものと、したがって、彼らはまれなものです。ボックスによって

エッセンシャルCOMは(のみPropGetメソッドとpropput取得および設定のために)それを言及doesntの。博士アル主要によってCOM IDL &インターフェイスデザインはP106でそれを言及ANS言う:

dispinterface DMyInterface { methods: 
... 
[id(3), propputref] void lMyProp([in] IDispatch *pDisp); 
} 

propputref属性は、Visual Basicの構文のidiosynraciesで、その起源を持っている奇妙小さい事です。以下を考慮してください。

Dim val as DMyOtherInterface 
Dim var as DMyInterface 

Set var.lMyProp = val 
var.lMyProp = val 

2つの割り当ては両方とも許可されていますが、全く異なるものを意味します。最初のassginmentでSetキーワードを使用すると、lMyPropにインターフェイス[...]が割り当てられていることが示されます。第2の割り当ては、valオブジェクトのオブジェクトのDMyOtherInterfaceインターフェイスのデフォルトメンバー(デフォルトメンバーはDISPID_VALUE IDでタグ付けされたメンバです)の値であるsimpe oneです。 DMyInterfaceインターフェイスのlMyPropプロパティに割り当てられています。

最初の割り当てはlMyPropプロパティに関連付けられたpropputrefメソッドを使用して実行され、2番目の割り当てはpropputメソッドが使用されます。これを有効にするには、propputref の両方のpropputメソッドを定義する必要があります。 あなたがこのようなやり方で混乱するならば、あなたは一人ではありません。 VBはプログラミングの性質を根本的に変えた多くの優れた機能を持っていますが、言語の定義は設計よりもむしろ市場主導であり、時にはと表示されます。

私は2000年の初めにそれを読んで以来、メジャーな本を使用していませんでした.COMと.COMバスト(それはその目的のための良い本です)。メモリレーンを降りてくれてありがとう - プログラミングが難しくなってきていると人々から教えてくれる方法が大好きです!

いけない、それは.otherに言及したが、私はVisual Studioのオートメーションは、COMに基づいている

+0

徹底的な調査をいただきありがとうございます。 –

+0

私の喜び。私は確信していますが、将来のあるときにはセシルのものを返すことになるでしょう:P –

+0

ああ、fwiw、Lidinの本もannotated CLI規格も、もっと多くの情報を提供していません。それに関連する他のメソッドやイベント、プロパティが存在する可能性があります。 –

2

あなたは(Mono.Cecil用BTWのおかげで多くのことを)やると確信しているかどうかを確認するために私と一緒にLidinの本を持っています。問題のプロパティは、おそらくCOM Interop(tlbimpの可能性)をサポートするツールを介して生成されています。私は実際の.Netベース言語でこれをコード化した人は誰も疑いません。

関連する問題