A WinRT component written in C# produces just one file, the winmd file which contains both the metadata and the implementation of the component. Furthermore, the same file can be used for all architectures (x86, x64 and ARM).
However, a WinRT component written in C++ produces two files - a winmd file which contains the metadata and a DLL file which contains the implementation. Furthermore, the DLL file is separate per architecture (one each for x86, x64 and ARM). It is for this reason that:
- adding a reference to just the winmd file doesn't make sense (since the implementation is in DLL)
- adding a reference to a single DLL file doesn't make sense a different DLL is required based on your project configuration/architecture
When you add a reference from your app VS project to the component VS project, the VS project system takes care of all of the above complexity for you. However when you don't have the sources/projects of the component, you can use the Extension SDK mechanism. if the DLL + WinMD combinations for all three architectures are packaged as an Extension SDK, then VS is able to correctly add the right configuration/architecture specific components into the app output.
For a real example of a C++ WinRT Extension SDK, take a look at the Bing Maps SDK. Install the SDK and then go to the following folder to see how the Extension SDK should be structured:
C:\Users\\AppData\Local\Microsoft SDKs\Windows\v8.1\ExtensionSDKs\Bing.Maps.Xaml\1.313.0825.0
Note that you don't necessarily need to install the Extension SDK on every machine you want to use your project. Currently ESDKs are a machine-wide entity (unlike NuGet) but they can be made per project using the instructions here.