Dela via


Runtime Anropsbar omslutning

Den vanliga språkkörningen exponerar COM-objekt via en proxy som kallas runtime callable wrapper (RCW). Även om RCW verkar vara ett vanligt objekt för .NET-klienter är dess primära funktion att konvertera anrop mellan en .NET-klient och ett COM-objekt.

Körningen skapar exakt en RCW för varje COM-objekt, oavsett antalet referenser som finns på objektet. Körningen har en enda RCW per process för varje objekt. Om du skapar en RCW i en programdomän eller lägenhet och sedan skickar en referens till en annan programdomän eller lägenhet används en proxy till det första objektet. Observera att den här proxyn är ett nytt hanterat objekt och inte samma som den ursprungliga RCW:n. Det innebär att de två hanterade objekten inte är lika med men representerar samma COM-objekt. Som följande bild visar kan valfritt antal hanterade klienter innehålla en referens till COM-objekt som exponeras INew och INewer gränssnitt.

Följande bild visar processen för att komma åt COM-objekt via den anropsbara omslutningen för körningsmiljön:

Process for accessing COM objects through the RCW.

Med metadata som härleds från ett typbibliotek skapar körningen både COM-objektet som anropas och en omslutning för objektet. Varje RCW har en cache med gränssnittspekare på COM-objektet som den omsluter och släpper sin referens på COM-objektet när RCW inte längre behövs. Körningen utför skräpinsamling på RCW.

Rcw samlar bland annat in data mellan hanterad och ohanterad kod för det omslutna objektets räkning. Mer specifikt tillhandahåller RCW marshalling för metodargument och metodreturvärden när klienten och servern har olika representationer av de data som skickas mellan dem.

Standardomslutningen tillämpar inbyggda marshallingregler. När en .NET-klient till exempel skickar en string typ som en del av ett argument till ett ohanterat objekt konverterar omslutningen string till en BSTR typ. Om COM-objektet returnerar en BSTR till den hanterade anroparen får anroparen en string. Både klienten och servern skickar och tar emot data som är bekanta för dem. Andra typer kräver ingen konvertering. En standardomslutning skickar till exempel alltid ett heltal på 4 byte mellan hanterad och ohanterad kod utan att konvertera typen.

Ordna valda gränssnitt

Det primära målet med den anropsbara omslutningen för körningsmiljön (RCW) är att dölja skillnaderna mellan de hanterade och ohanterade programmeringsmodellerna. För att skapa en sömlös övergång använder RCW valda COM-gränssnitt utan att exponera dem för .NET-klienten, som du ser i följande bild.

Följande bild visar COM-gränssnitt och den anropsbara omslutningen för körning:

Screenshot of the runtime callable wrapper with interfaces.

När det skapas som ett tidigt bundet objekt är RCW en specifik typ. Den implementerar de gränssnitt som COM-objektet implementerar och exponerar metoder, egenskaper och händelser från objektets gränssnitt. I bilden exponerar RCW INew-gränssnittet men använder gränssnitten IUnknown och IDispatch . Dessutom exponerar RCW alla medlemmar i INew-gränssnittet för .NET-klienten.

RCW använder de gränssnitt som anges i följande tabell, som exponeras av objektet som den omsluter.

Gränssnitt beskrivning
Idispatch För sen bindning till COM-objekt via reflektion.
IErrorInfo Innehåller en textbeskrivning av felet, dess källa, en hjälpfil, hjälpkontext och GUID för gränssnittet som definierade felet (alltid GUID_NULL för .NET-klasser).
IProvideClassInfo Om COM-objektet som omsluts implementerar IProvideClassInfo extraherar RCW typinformationen från det här gränssnittet för att ge bättre typidentitet.
Iunknown För objektidentitet, typtvång och livslängdshantering:

– Objektidentitet
Körningen skiljer mellan COM-objekt genom att jämföra värdet för IUnknown-gränssnittet för varje objekt.
- Skriv tvång
RCW identifierar identifiering av dynamisk typ som utförs av metoden QueryInterface .
– Livslängdshantering
Med metoden QueryInterface hämtar och innehåller RCW en referens till ett ohanterat objekt tills körningen utför skräpinsamling på omslutningen, vilket frigör det ohanterade objektet.

RCW använder eventuellt gränssnitten som anges i följande tabell, som exponeras av objektet som den omsluter.

Gränssnitt beskrivning
I Anslut ionPoint och I Anslut ionPointContainer RCW konverterar objekt som exponerar händelseformatet för anslutningspunkter till delegerade händelser.
IDispatchEx (endast.NET Framework) Om klassen implementerar IDispatchEx implementerar RCW IExpando. IDispatchEx-gränssnittet är en förlängning av IDispatch-gränssnittet som, till skillnad från IDispatch, möjliggör uppräkning, tillägg, borttagning och skiftlägeskänsliga anrop av medlemmar.
IEnumVARIANT Aktiverar COM-typer som stöder uppräkningar som ska behandlas som samlingar.

Se även