File types and extensions in Visual Studio 2012
The Visual Studio 2010 SDK introduced the new class FileExtensionToContentTypeDefinition
. This post is all about why I no longer use/export this class, and what I now do instead. The steps in this post only associate specific, known extension(s) with a content type. Further integration into the user-customizable File Types settings and Open With… features requires additional work described in my answer to this Stack Overflow question: Supporting user-specified file extensions in custom Visual Studio language service.
The following requirements led me away from this attribute.
- The Type & Member Dropdown Bars feature is not exposed through an MEF editor extension point. Supporting this feature requires providing an implementation of
IVsCodeWindowManager
(beyond the scope of this article). - To provide an implementation of
IVsCodeWindowManager
, you must provide an implementation ofIVsLanguageInfo
. - If you provide an implementation of
IVsLanguageInfo
, theGetFileExtensions
andGetLanguageName
methods of that interface will be used instead of the values given toFileExtensionToContentTypeDefinition
.
To maximize your ability to support the full range of Visual Studio features in your extension, you can take the following steps to register your new language or file type.
1. In your VSPackage.resx file, add the following values.
- 100 – Language name
- 110 – Package name
- 111 – Package description
2. Derive a package class from Package
.
[PackageRegistration(UseManagedResourcesOnly = true)] [InstalledProductRegistration("#110", "#111", "1.0")] [Guid("your guid here")] public class ExamplePackage : Package { } |
3. Implement IVsLanguageInfo
.
This is actually pretty simple.
4. Register the IVsLanguageInfo
implementation
Register the IVsLanguageInfo
implementation using the ProvideLanguageServiceAttribute
and ProvideLanguageExtensionAttribute
registration attributes. Override the Package.Initialize
method to provide the implementation. Here is the updated ExamplePackage
class.
5. Create and export a ContentTypeDefinition
.
NOTE: Since we are not using a custom editor factory, the content type name used here must match the language name used as the 2nd argument to ProvideLanguageExtensionAttribute
above.
Hallo Sam,
i am also a plugin author.. And I am also fighting through the poor msdn documentation.. After following your example and with the help of python tools, I managed to add navigation bars for my custom language.. The problem is however, that now PowerProductivity tools try to go to the references of the tokens from my custom language.
I believe the problem is, that my MEF extensions use ContentType of “text” because I didn’t know how to map different file extensions, or user defined extensions for my plugin.. So what I ended up doing was , enabling my plugin for all text files and disabling the functionality by reading the associated extensions through the registry..
Do you have any idea how to properly implement this ?
Thanks
August 20th, 2013 at 4:53 am