3

ここから

動的型の非常に大きな利点は、C# と外部および非ネイティブ オブジェクト (特に COM オブジェクト) との関係について考え始めるときに得られます。この場合、COM IDispatch インターフェイスを使用して動的型が解決されます。つまり、Primary Interop Assembly (PIA) を使用せずに、COM オブジェクトを「そのまま」使用できることを意味します。多くの COM オブジェクトは、さまざまな標準データ型のいずれかを格納できるバリアント型を広範に使用するため、バリアントの代わりに動的型を使用できると非常に簡単になります。

C# で dynamic がどのように使用されているかは既に知っていますが、その方法を知りたいです (通常は COM を使用)。

Office COM オブジェクト モデルの例を見る:

(Excel.Range)excel.Cells[1,1]).Value= "some string"

はオブジェクト タイプを使用してバリアントを表すため、キャストを含める必要があります。PIA

現在(2010 ...)、動的では次のように実行できます:

excel.Cells[1,1].Value= "some string"

しかし

オブジェクトは、実装することによってバインディング セマンティクスを提供できます。DynamicObject

そのような :

public class MyClass: DynamicObject
{
  public override bool TryInvokeMember (  InvokeMemberBinder binder, object[] args, out object result)
    {
      ...
    }
}

だから私の質問:

MSは動作[changed] or [added code] or [now-inherit-DynamicObject] を許可するために COM オブジェクトを使用excel.Cells[1,1].Value= "some string"しましたか?

彼らはこのメカニズム全体を再構築しましたか?

4

3 に答える 3

6

いいえ、隠し味はここのCOMです。これは、2 つのインターフェースと 5 つのメソッドのみで実行されます。1 つ目は、すべての COM オブジェクトによって実装されるインターフェイスである IUnknown です。3 つの方法があります。

  • AddRef()、COM オブジェクトの参照カウントをインクリメントします。これはメモリ管理機能であり、カウントがゼロでない限り、オブジェクトは存続します。COM オブジェクトへのポインターを格納するには、IUnknown.AddRef() を呼び出す必要があります。

  • Release() は、参照カウントをデクリメントします。AddRef の反対であり、インターフェイス ポインターが使用されなくなったときに呼び出す必要があります。カウントがゼロになると、COM オブジェクトは解放されます。この関数は、Office を使用する .NET コードで Marshal.ReleaseComObject() を使用する悪名高い背後にある主な理由です。通常、COM ラッパーのファイナライザーによって呼び出されます。

  • QueryInterface() は、別のインターフェイスへのポインターを返すように COM オブジェクトに要求します。この質問の範囲では、それが C# が IDispatch インターフェイス ポインターを取得する方法です。

IDispatch インターフェイスは、DynamicObject にほぼ相当する動的バインディングを実装するインターフェイスです。4 つのメソッドがあり、そのうちの 2 つはこのコンテキストで重要です。

  • GetIDsOfNames() は、名前を数字のdispidに変換します。これは、C# プログラムの識別子を COM オブジェクトのメソッドまたはプロパティ名に一致させる方法です。

  • Invoke() は、dispid を使用してプロパティ getter/setter の COM メソッドを呼び出します

これが全体像です。これらのインターフェイスについて詳しく知りたい場合は、MSDN ライブラリを使用してください。

于 2012-12-31T08:24:06.783 に答える
2

DLR (dynamic キーワードが提供するインターフェイス) は、「バインダー」を使用して適切な動的オブジェクトとインターフェイスします (C# バインダー、VB バインダー、COM バインダーなどがあります)。COM バインダーは、"従来の" COM 相互運用機能を使用する独立したコンポーネントであり、置き換えられず、動的なしで引き続き使用できます。.NET 4.0 向けに拡張されましたが、動的だけではありません。

于 2012-12-31T08:25:19.113 に答える
1

dynamicどのタイプでもお使いいただけます。クラスで動的インターフェイスを提供するDynamicObject場合にのみ、から派生させる必要があります。

次の行は、DateTime が DynamicObject から継承する必要なく機能します。

dynamic myDate=DateTime.Now;

編集

COM+ が動的バインドをどのようにサポートしているかについては、常にサポートしています。実際、ドキュメントはこれがどのように行われるかを正確に説明しています。

COM は常に、DynamicObject とほぼ同じように機能する IDispatch インターフェイスを介して、独自の種類の動的バインディングをサポートしていました。IDispatch を使用すると、オブジェクトは特定のインターフェイスとサポートするメソッドのクエリに応答できます。

dynamicタイプ ライブラリやプロキシを持たない未加工の COM オブジェクトに IDispatch インターフェイスを使用できます。それ以外の場合は dynamic、IDispatch インターフェイスを経由せずにプロキシ メソッドを呼び出します。

COM の動的バインディングでは、特定のインターフェイスを抽出してそのメソッドを呼び出すために複数の呼び出しが必要になるため、パフォーマンス ヒットが発生します。VB6 の時代、人々はタイプ ライブラリを使用して動的バインディングの使用を最小限に抑えたり、排除したりしようとしました。これは、.NET に対する適切なアドバイスでもあります。

于 2012-12-31T07:50:34.623 に答える