Partager via


Enregistrement d'un service de langage (managed de package)

Dans managed package (MPF), le service de langage est offert par un VSPackage (consultez VSPackages) et est enregistré avec Visual Studio en ajoutant des clés de Registre et des entrées. Cette procédure d'inscription est effectuée dans en partie pendant l'installation et partiellement au moment de l'exécution.

Enregistrez le service linguistique à l'aide de attributs

Les attributs suivants sont utilisés pour enregistrer un service de langage.

ces attributs sont expliqués ci-dessous

ProvideServiceAttribute

Cet attribut enregistre votre service de langage comme un service.

Exemple

using Microsoft.VisualStudio.Shell;

namespace TestLanguagePackage
{
    [ProvideServiceAttribute(typeof(TestLanguageService),
                             ServiceName = "Test Language Service")]

    public class TestLanguagePackage : Package
    {
    }
}

ProvideLanguageServiceAttribute

Cet attribut enregistre votre service de langage particulier en tant que service de langage. Elle vous permet de définir des options qui spécifient les fonctionnalités que votre service de langage offre. L'exemple illustre un sous-ensemble des options qu'un service de langage peut fournir. Pour l'ensemble des options de service de langage, consultez l' ProvideLanguageServiceAttribute.

Exemple

using Microsoft.VisualStudio.Shell;

namespace TestLanguagePackage
{
    [ProvideLanguageServiceAttribute(typeof(TestLanguageService),
                             "Test Language",
                             106,             // resource ID of localized language name
                             CodeSense = true,             // Supports IntelliSense
                             RequestStockColors = false,   // Supplies custom colors
                             EnableCommenting = true,      // Supports commenting out code
                             EnableAsyncCompletion = true  // Supports background parsing
                             )]

    public class TestLanguagePackage : Package
    {
    }
}

ProvideLanguageExtensionAttribute

Cet attribut associe votre service de langage avec une extension de fichier. Chaque fois qu'un fichier à cette extension est chargé, dans tout projet, votre service de langage est démarré et utilisé pour afficher le contenu du fichier.

Exemple

using Microsoft.VisualStudio.Shell;

namespace TestLanguagePackage
{
    [ProvideLanguageExtensionAttribute(typeof(TestLanguageService),
                                       ".Testext")]

    public class TestLanguagePackage : Package
    {
    }
}

ProvideLanguageCodeExpansionAttribute

Cet attribut enregistre un emplacement à partir duquel les modèles d'expansion ou des extraits de code sont obtenus. Ces informations sont utilisées par Navigateur des extraits de code et par l'éditeur lorsqu'un extrait de code est inséré dans le fichier source.

Exemple

using Microsoft.VisualStudio.Shell;

namespace TestLanguagePackage
{
    [ProvideLanguageCodeExpansionAttribute(
             typeof(TestLanguageService),
             "Test Language", // Name of language used as registry key.
             106,           // Resource ID of localized name of language service.
             "testlanguage",  // language key used in snippet templates.
             @"%InstallRoot%\Test Language\SnippetsIndex.xml",  // Path to snippets index
             SearchPaths = @"%InstallRoot%\Test Language\Snippets\%LCID%\Snippets\;" +
                           @"%TestDocs%\Code Snippets\Test Language\Test Code Snippets"
             )]

    public class TestLanguagePackage : Package
    {
    }
}

ProvideLanguageEditorOptionPageAttribute

cet attribut enregistre une page de propriétés à afficher dans la boîte de dialogue d' Options sous la catégorie d' Éditeur de texte . Utilisez l'un de ces attributs pour chaque page à afficher pour votre service de langage. Si vous devez planifier vos pages dans une arborescence, utilisez les attributs supplémentaires pour définir chaque nœud de l'arborescence.

Exemple

Cet exemple montre deux pages de propriétés, Options et Mise en retrait, et un nœud qui contient la deuxième page de propriétés.

using Microsoft.VisualStudio.Shell;

namespace TestLanguagePackage
{
    [ProvideLanguageEditorOptionAttribute(
             "Test Language",  // Registry key name for language
             "Options",      // Registry key name for property page
             "#242",         // Localized name of property page
             OptionPageGuid = "{A2FE74E1-FFFF-3311-4342-123052450768}"  // GUID of property page
             )]
    [ProvideLanguageEditorOptionAttribute(
             "Test Language",  // Registry key name for language
             "Advanced",     // Registry key name for node
             "#243",         // Localized name of node
             )]
    [ProvideLanguageEditorOptionAttribute(
             "Test Language",  // Registry key name for language
             @"Advanced\Indenting",     // Registry key name for property page
             "#244",         // Localized name of property page
             OptionPageGuid = "{A2FE74E2-FFFF-3311-4342-123052450768}"  // GUID of property page
             )]

    public class TestLanguagePackage : Package
    {
    }
}

Offrez le service de langage au moment de l'exécution

Lorsque votre package de langage est chargé, vous devez indiquer à Visual Studio que votre service de langage est prêt. Pour ce faire en proposant le service. Cela s'effectue dans la méthode d' Initialize . En outre, vous devez démarrer une minuterie qui appelle votre service de langage pendant les périodes inactives donc l'analyse d'arrière-plan peut être effectuée. Ce interfère avec les minuteries est également utilisé pour mettre à jour les propriétés de document si vous en avez implémenté via la classe d' DocumentProperties . Pour prendre en charge une minuterie, votre package doit implémenter l'interface d' IOleComponent (seule la méthode d' FDoIdle doit être totalement implémentée ; les autres méthodes peuvent retourner des valeurs par défaut).

Exemple

Cet exemple présente une approche courante à offrir un service et à fournir un interfère avec les minuteries.

using System;
using System.Runtime.InteropServices;
using System.ComponentModel.Design;
using Microsoft.VisualStudio.Package;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.OLE.Interop;
using Microsoft.VisualStudio.TextManager.Interop;

namespace TestLanguagePackage
{
    [Microsoft.VisualStudio.Shell.ProvideService(typeof(TestLanguageService))]
    [Microsoft.VisualStudio.Shell.ProvideLanguageExtension(typeof(TestLanguageService), ".testext")]
    [Microsoft.VisualStudio.Shell.ProvideLanguageService(typeof(TestLanguageService), "Test Language", 0,
        AutoOutlining = true,
        EnableCommenting = true,
        MatchBraces = true,
        ShowMatchingBrace = true)]
    [Guid("00000000-0000-0000-0000-00000000000")] //provide a unique GUID for the package

    public class TestLanguagePackage : Package, IOleComponent
    {
        private uint m_componentID;


        protected override void Initialize()
        {
            base.Initialize();  // required

            // Proffer the service.
            IServiceContainer serviceContainer = this as IServiceContainer;
            TestLanguageService langService      = new TestLanguageService();
            langService.SetSite(this);
            serviceContainer.AddService(typeof(TestLanguageService),
                                        langService,
                                        true);

            // Register a timer to call our language service during
            // idle periods.
            IOleComponentManager mgr = GetService(typeof(SOleComponentManager))
                                       as IOleComponentManager;
            if (m_componentID == 0 && mgr != null)
            {
                OLECRINFO[] crinfo = new OLECRINFO[1];
                crinfo[0].cbSize            = (uint)Marshal.SizeOf(typeof(OLECRINFO));
                crinfo[0].grfcrf            = (uint)_OLECRF.olecrfNeedIdleTime |
                                              (uint)_OLECRF.olecrfNeedPeriodicIdleTime;
                crinfo[0].grfcadvf          = (uint)_OLECADVF.olecadvfModal     |
                                              (uint)_OLECADVF.olecadvfRedrawOff |
                                              (uint)_OLECADVF.olecadvfWarningsOff;
                crinfo[0].uIdleTimeInterval = 1000;
                int hr = mgr.FRegisterComponent(this, crinfo, out m_componentID);
            }
        }


        protected override void Dispose(bool disposing)
        {
            if (m_componentID != 0)
            {
                IOleComponentManager mgr = GetService(typeof(SOleComponentManager))
                                           as IOleComponentManager;
                if (mgr != null)
                {
                    int hr = mgr.FRevokeComponent(m_componentID);
                }
                m_componentID = 0;
            }

            base.Dispose(disposing);
        }


        #region IOleComponent Members

        public int FDoIdle(uint grfidlef)
        {
            bool bPeriodic = (grfidlef & (uint)_OLEIDLEF.oleidlefPeriodic) != 0;
            // Use typeof(TestLanguageService) because we need to
            // reference the GUID for our language service.
            LanguageService service = GetService(typeof(TestLanguageService))
                                      as LanguageService;
            if (service != null)
            {
                service.OnIdle(bPeriodic);
            }
            return 0;
        }

        public int FContinueMessageLoop(uint uReason,
                                        IntPtr pvLoopData,
                                        MSG[] pMsgPeeked)
        {
            return 1;
        }

        public int FPreTranslateMessage(MSG[] pMsg)
        {
            return 0;
        }

        public int FQueryTerminate(int fPromptUser)
        {
            return 1;
        }

        public int FReserved1(uint dwReserved,
                              uint message,
                              IntPtr wParam,
                              IntPtr lParam)
        {
            return 1;
        }

        public IntPtr HwndGetWindow(uint dwWhich, uint dwReserved)
        {
            return IntPtr.Zero;
        }

        public void OnActivationChange(IOleComponent pic,
                                       int fSameComponent,
                                       OLECRINFO[] pcrinfo,
                                       int fHostIsActivating,
                                       OLECHOSTINFO[] pchostinfo,
                                       uint dwReserved)
        {
        }

        public void OnAppActivate(int fActive, uint dwOtherThreadID)
        {
        }

        public void OnEnterState(uint uStateID, int fEnter)
        {
        }

        public void OnLoseActivation()
        {
        }

        public void Terminate()
        {
        }

        #endregion
    }
}