CHAPTER 16 DYNAMIC TYPES AND THE DYNAMIC LANGUAGE RUNTIME
Once you select a COM library, the IDE will respond by generating a brand new assembly that
contains .NET descriptions of COM metadata. Formally speaking, these are termed interoperability
assemblies (or simply, interop assemblies). Interop assemblies do not contain any implementation code,
except for a small amount that helps translate COM events to .NET events. However, these interop
assemblies are very useful in that they shield your .NET codebase from the complex underbelly of COM
internals.
In your C# code, you can directly program against the interop assembly, allowing the CLR (and if
you use the dynamic keyword, the DLR) to automatically map .NET data types into COM types, and vice
versa. Behind the scenes, data is marshaled between the .NET and COM applications using a Runtime
Callable Wrapper (RCW), which is basically a dynamically generated proxy. This RCW proxy will marshal
and transform .NET data types into COM types and map any COM return values into .NET equivalents.
Figure 16-6 shows the big picture of .NET to COM interoperability.
Figure 16-6. .NET programs communicate with COM objects using a proxy termed the RCW
The Role of Primary Interop Assemblies (PIAs)
Many COM libraries created by COM library vendors (such as the Microsoft COM libraries that allow
access to the object model of Microsoft Office products) provide an “official” interoperability assembly
termed a primary interop assembly or PIA. PIAs are optimized interop assemblies, which clean up (and
possibly extend) the code typically generated when referencing a COM library using the Add Reference
dialog box.
PIAs are typically listed in the Assemblies section of the Add Reference dialog box (under the
Extensions subarea). In fact, if you reference a COM library from the COM tab of the Add Reference
dialog box, Visual Studio will not generate a new interoperability library as it would normally do, but use
the provided PIA instead. Figure 16-7 shows the PIA of the Microsoft Office Excel object model, which
you will be using in the next example.
613