System.Runtime.InteropServices.ComWrappers-klass

Anmärkning

Den här artikeln innehåller ytterligare kommentarer till referensdokumentationen för det här API:et.

API:et ComWrappers tillhandahåller stöd för API:et IUnknown oberoende av det inbyggda stödet för COM-samverkan. ComWrappers API:et exponerar det minimala runtime-stöd som krävs för att utvecklare ska kunna ersätta den inbyggda versionen på ett effektivt sätt.

Traditionellt i runtime-miljön kallas en inbyggd proxy till hanterat objekt för en COM Callable Wrapper (CCW) och en hanterad proxy till ett inbyggt objekt kallas för en Runtime Callable Wrapper (RCW). Men när de används här bör dessa termer inte förväxlas med de inbyggda funktionerna med samma namn (det vill: CCW och RCW). Till skillnad från de inbyggda funktionerna lämnas en majoritet av ansvaret för korrekt livslängdshantering, distributionsmetoder och organisering av argument och returvärden till ComWrappers implementeraren.

"Minimalt stöd" definieras av följande funktioner:

  1. Effektiv mappning mellan ett hanterat objekt och en intern proxy (till exempel CCW).
  2. Effektiv mappning mellan en intern IUnknown och dess hanterade proxy (till exempel RCW).
  3. Integrering med skräpinsamlaren via IReferenceTrackerHost-gränssnittskontraktet .

Att utnyttja detta är ett avancerat scenario.

Proxytillstånd

Det här avsnittet innehåller beskrivningar och illustrationer av ursprungliga och hanterade proxytillstånd efter deras respektive skapande.

I följande illustrationer visas en stark referens som en solid linje (===) och en svag referens visas som en streckad linje (= = =). Termerna "stark referens" och "svag referens" bör tolkas som "förlänga livslängden" och "inte förlänga livslängden", i stället för att antyda en specifik implementering.

Följande bild visar tillståndet för det hanterade objektet och den interna proxyn efter ett anrop till ComWrappers.GetOrCreateComInterfaceForObject(Object, CreateComInterfaceFlags).

 --------------------                  ----------------------
|   Managed object   |                |     Native proxy     |
|                    |                | Ref count: 1         |
|  ----------------  |                |  ------------------  |
| | Weak reference |=| = = = = = = = >| | Strong reference | |
| |    to proxy    | |<===============|=|    to object     | |
|  ----------------  |                |  ------------------  |
 --------------------                  ----------------------

Nästa bild visar tillståndet för det inbyggda objektet och den hanterade proxyn efter ett anrop till ComWrappers.GetOrCreateObjectForComInstance(IntPtr, CreateObjectFlags). Begreppet "identitet" följer reglerna för IUnknown.

 ------------------               ------------------
|  Native object   |< = = = = = =|                  |
| Ref count: +1    |             | Mapping from     |
 ------------------              | native identity  |
 ------------------------        | to managed proxy |
|   Managed proxy        |< = = =|                  |
| Created by ComWrappers |        ------------------
|   implementer.        |
| Optional AddRef() on   |
|   native object.      |
 ------------------------

Observera att det bara finns svaga referenser ur ett körtidsperspektiv. Referensantalet +1 för det inbyggda objektet antas utföras av den hanterade proxyskaparen (dvs ComWrappers . implementeraren) för att säkerställa den associerade livslängden mellan det interna objektet och dess hanterade proxy. Det finns en valfri stark referens (dvs AddRef(). ) som nämns i den hanterade proxyn, som används för att stödja scenario (3) som nämnts tidigare. Se även CreateObjectFlags.TrackerObject. Med den här valfria starka referensen skulle referensantalet vara +2.