Aracılığıyla paylaş


mef kullanarak dsl genişletin

Exntend yönetilen genişletilebilirlik Framework (mef) kullanarak etki alanına özgü dilinizi (dsl) olabilir.Siz veya diğer geliştiriciler uzantıları için dsl dsl tanımı ve program kodu değiştirmeden yazabiliyor olacaktır.Bu tür uzantılar, menü komutlarını, sürükle ve bırak işleyicileri ve doğrulama ekleyin.Kullanıcılar dsl yükleyin ve sonra isteğe bağlı olarak uzantıları için yüklemek mümkün olacaktır.

dsl mef etkinleştirdiğinizde, tüm dsl ile birlikte yerleşiktir bile buna ek olarak, bu, dsl, özelliklerinden bazıları yazmak kolay olabilir.

MEF hakkında daha fazla bilgi için, bkz. Managed Extensibility Framework (MEF).

mef tarafından genişletilmesi dsl etkinleştirmek için

  1. Adlı yeni bir klasör oluşturun MefExtension içinde DslPackage proje.Aşağıdaki dosyalar ekleyebilirsiniz:

    Dosya adı

    Dosya içeriği

    CommandExtensionVSCT.tt

    Önemli notÖnemli
    GUID bu dosyayı DslPackage\GeneratedCode\Constants.tt tanımlanan GUID CommandSetId aynı olacak şekilde ayarlayın
    <#@ Dsl processor="DslDirectiveProcessor" requires="fileName='..\..\Dsl\DslDefinition.dsl'" #>
    <#
    // CmdSet Guid must be defined before master template is included
    // This Guid must be kept synchronized with the CommandSetId Guid in Constants.tt
    Guid guidCmdSet = new Guid ("00000000-0000-0000-0000-000000000000");
    string menuidCommandsExtensionBaseId="0x4000";
    #>
    <#@ include file="DslPackage\CommandExtensionVSCT.tt" #>

    CommandExtensionRegistrar.tt

    <#@ Dsl processor="DslDirectiveProcessor" requires="fileName='..\..\Dsl\DslDefinition.dsl'" #>
    <#@ include file="DslPackage\CommandExtensionRegistrar.tt" #>

    ValidationExtensionEnablement.tt

    <#@ Dsl processor="DslDirectiveProcessor" requires="fileName='..\..\Dsl\DslDefinition.dsl'" #>
    <#@ include file="DslPackage\ValidationExtensionEnablement.tt" #>

    ValidationExtensionRegistrar.tt

    Bu dosya eklerseniz, doğrulama, dsl anahtarları en az birini kullanarak etkinleştirmeniz gerekir Editor\Validation dsl Explorer.

    <#@ Dsl processor="DslDirectiveProcessor" requires="fileName='..\..\Dsl\DslDefinition.dsl'" #>
    <#@ include file="DslPackage\ValidationExtensionRegistrar.tt" #>

    PackageExtensionEnablement.tt

    <#@ Dsl processor="DslDirectiveProcessor" requires="fileName='..\..\Dsl\DslDefinition.dsl'" #>
    <#@ include file="DslPackage\PackageExtensionEnablement.tt" #>
  2. Adlı yeni bir klasör oluşturun MefExtension içinde Dsl proje.Aşağıdaki dosyalar ekleyebilirsiniz:

    Dosya adı

    İçerik

    DesignerExtensionMetaDataAttribute.tt

    <#@ Dsl processor="DslDirectiveProcessor" requires="fileName='..\..\Dsl\DslDefinition.dsl'" #>
    <#@ include file="Dsl\DesignerExtensionMetadataAttribute.tt" #>

    GestureExtensionEnablement.tt

    <#@ Dsl processor="DslDirectiveProcessor" requires="fileName='..\..\Dsl\DslDefinition.dsl'" #>
    <#@ include file="Dsl\GestureExtensionEnablement.tt" #>

    GestureExtensionController.tt

    <#@ Dsl processor="DslDirectiveProcessor" requires="fileName='..\..\Dsl\DslDefinition.dsl'" #>
    <#@ include file="Dsl\GestureExtensionController.tt" #>
  3. Aşağıdaki satırı adlı varolan bir dosyayı eklemek DslPackage\Commands.vsct:

    <Include href="MefExtension\CommandExtensionVSCT.vsct"/>
    

    Sonra varolan satır eklemek <Include> yönergesi.

  4. DslDefinition.dsl açın.

  5. dsl Gezgini'nde seçin Editor\Validation.

  6. Properties penceresinde özelliklerini en az biri adlı emin olun kullanır... is true.

  7. Solution Explorer araç çubuğunda Dönüştürme tüm şablonları.

    Bayi dosyaları her eklediğiniz dosyalar altında görünür.

  8. Oluşturup hala çalıştığından emin olmak için çözüm çalıştırın.

dsl, mef etkin sunulmuştur.Menü komutlarını, hareket işleyicileri ve doğrulama kısıtlamaları mef uzantılar yazabilirler.Diğer özel kodla birlikte dsl çözümünüzdeki bu uzantılar yazabilirler.Buna ek olarak, sizin veya diğer geliştiriciler ayrı yazabilirsiniz Visual Studio dsl genişletmek uzantıları.

mef etkin bir dsl için uzantı oluşturma

Kendiniz veya bir başkası tarafından oluşturulan mef etkin bir dsl erişiminiz varsa, onun için uzantılar yazabilirler.Uzantıları, menü komutlarını, hareket işleyicileri veya doğrulama kısıtlamaları eklemek için kullanılabilir.Bu uzantılar yazmak için kullandığınız bir Visual Studio uzantısı (VSIX) çözümü.Çözüm iki bölümden oluşur: bir kod derlemesi oluşturur bir class library projesi ve derleme paketleri bir VSIX projesi.

dsl uzantısı VSIX oluşturmak için

  1. Yeni bir class library projesi oluşturun.Bunu yapmak için Yeni bir proje Seç iletişim kutusunda Visual Basic veya Visual C# seçip Class Library.

  2. Yeni sınıf kitaplığı projesi içinde bir dsl derleme başvurusu ekleyin.

    • Bu derleme genellikle ile biten bir adı vardır ".DSL.dll".

    • dsl proje erişiminiz varsa, derleme dosyası dizininin altında bulabilirsinizDsl\bin\*

    • dsl VSIX dosyaya erişiminiz varsa, VSIX dosyasının dosya adı uzantısını ".zip" olarak değiştirerek derleme bulabilirsiniz..Zip dosyasını indirip sıkıştırmasını açın.

  3. Aşağıdaki başvuru ekleyin.net derlemeleri olarak yüklenir:

    • Microsoft.VisualStudio.Modeling.SDK.11.0.dll

    • Microsoft.VisualStudio.Modeling.SDK.Diagrams.11.0.dll

    • Microsoft.VisualStudio.Modeling.SDK.Shell.11.0.dll

    • System.ComponentModel.Composition.dll

    • System.Windows.Forms.dll

  4. VSIX proje aynı çözümü oluşturun.Bunu yapmak için Yeni bir proje iletişim kutusunda, genişletme Visual Basic veya Visual C#,'ı genişletilebilirlikseçip VSIX proje.

  5. Solution Explorer'da, VSIX proje sağ tıklatın ve ardından Set as StartUp Project'i.

  6. Yeni Project'te açın source.extension.vsixmanifest.

  7. İçerik Ekle'ye tıklayın.İletişim kutusunda ayarlanan İçerik türü için mef bileşen, ve Kaynak proje class library projesi için.

  8. dsl VSIX başvurusu ekleyin.

    1. De source.extension.vsixmanifest,'ı Add Reference

    2. İletişim kutusunda tıklatın Eklemek yük ve dsl VSIX dosyasını bulun.VSIX dosya dsl çözümde de yerleşik olan DslPackage\bin\*.

      Bu kullanıcıların aynı anda dsl ve dahili numaranız yüklemesine olanak sağlar.Kullanıcı dsl yüklediyse, yalnızca kendi uzantısı yüklenir.

  9. Gözden geçirin ve diğer alanları güncelleştirmek source.extension.vsixmanifest.Tıklatın Sürümleri seçin emin olun ve doğru Visual Studio sürümleri ayarlanır.

  10. Kod, sýnýf kitaplýðý projesine ekleyin.Örnekler, sonraki bölümde bir kılavuz olarak kullanın.

    Herhangi bir sayıda komut, hareketi ve doğrulama sınıfları ekleyebilirsiniz.

  11. Uzantı sınamak için basın F5.Deneysel örneğinde Visual Studio, oluşturmak veya bir dsl örnek dosyasını açın.

mef uzantıları için DSLs yazma

Ayrı bir dsl uzantısı çözümü derleme kod projede uzantılar yazabilirler.Ayrıca DslPackage projenizde mef dsl bir parçası olarak komutları, hareketleri ve doğrulama kodu yazmak için kullanışlı bir yol olarak kullanabilirsiniz.

Ff972471.collapse_all(tr-tr,VS.110).gifMenü Komutları

Bir menü komutu yazmak için uygulayan bir sınıf tanımlamak ICommandExtension ve sınıf adlı kendi dsl içinde tanımlanan öznitelik ile önek YourDslCommandExtension.Birden fazla menü komutu sınıf yazabilirsiniz.

QueryStatus()her kullanıcı Diyagramı sağ olarak adlandırılır.Geçerli seçimi incelemek ve ayarlamak gerekir command.Enabled komut ne zaman uygun olduğunu göstermek için.

using System.ComponentModel.Composition;
using System.Linq;
using Company.MyDsl; // My DSL
using Company.MyDsl.ExtensionEnablement; // My DSL
using Microsoft.VisualStudio.Modeling; // Transactions
using Microsoft.VisualStudio.Modeling.Diagrams.ExtensionEnablement; // IVsSelectionContext
using Microsoft.VisualStudio.Modeling.ExtensionEnablement; // ICommandExtension

namespace MyMefExtension
{
  // Defined in Dsl\MefExtension\DesignerExtensionMetaDataAttribute.cs:
  [MyDslCommandExtension] 
  public class MyCommandClass : ICommandExtension
  { 
    /// <summary>
    /// Provides access to current document and selection.
    /// </summary>
    [Import]
    IVsSelectionContext SelectionContext { get; set; }

    /// <summary>
    /// Called when the user selects this command.
    /// </summary>
    /// <param name="command"></param>
    public void Execute(IMenuCommand command)
    {
      // Transaction is required if you want to update elements.
      using (Transaction t = SelectionContext.CurrentStore
              .TransactionManager.BeginTransaction("fix names"))
      {
        foreach (ExampleShape shape in SelectionContext.CurrentSelection)
        {
          ExampleElement element = shape.ModelElement as ExampleElement;
          element.Name = element.Name + " !";
        }
        t.Commit();
      }
    }

    /// <summary>
    /// Called when the user right-clicks the diagram.
    /// Determines whether the command should appear.
    /// This method should set command.Enabled and command.Visible.
    /// </summary>
    /// <param name="command"></param>
    public void QueryStatus(IMenuCommand command)
    {
      command.Enabled =
        command.Visible = (SelectionContext.CurrentSelection.OfType<ExampleShape>().Count() > 0);
    }

    /// <summary>
    /// Called when the user right-clicks the diagram.
    /// Determines the text of the command in the menu.
    /// </summary>
    public string Text
    {
      get { return "My menu command"; }
    }
  }
}

Ff972471.collapse_all(tr-tr,VS.110).gifHareket işleyicileri

Bir hareketi işleyicisi içinde veya dışında Diyagram bir yerden sürüklenerek nesnelerle yapabilmekte Visual Studio.Aşağıdaki örnek dosyaları Windows Explorer'dan Diyagram sürükleyin sağlar.Dosya adları içeren öğeler oluşturur.

Diğer dsl modelleri ve uml modelleri ile drags dağıtılacak işleyicileri yazabilirsiniz.Daha fazla bilgi için bkz. Nasıl yapılır: sürükle ve bırak işleyicisi ekleyin.

using System.ComponentModel.Composition;
using System.Linq;
using Company.MyDsl;
using Company.MyDsl.ExtensionEnablement;
using Microsoft.VisualStudio.Modeling; // Transactions
using Microsoft.VisualStudio.Modeling.Diagrams;
using Microsoft.VisualStudio.Modeling.Diagrams.ExtensionEnablement; 
using Microsoft.VisualStudio.Modeling.ExtensionEnablement; 

namespace MefExtension
{
  [MyDslGestureExtension]
  class MyGestureExtension : IGestureExtension
  {
    public void OnDoubleClick(ShapeElement targetElement, DiagramPointEventArgs diagramPointEventArgs)
    {
      System.Windows.Forms.MessageBox.Show("double click!");
    }
    
    /// <summary>
    /// Called when the user drags anything over the diagram.
    /// Return true if the dragged object can be dropped on the current target.
    /// </summary>
    /// <param name="targetMergeElement">The shape or diagram that the mouse is currently over</param>
    /// <param name="diagramDragEventArgs">Data about the dragged element.</param>
    /// <returns></returns>
    public bool CanDragDrop(ShapeElement targetMergeElement, DiagramDragEventArgs diagramDragEventArgs)
    {
      // This handler only allows items to be dropped onto the diagram:
      return targetMergeElement is MefDsl2Diagram &&
      // And only accepts files dragged from Windows Explorer:
        diagramDragEventArgs.Data.GetFormats().Contains("FileNameW");
    }


    /// <summary>
    /// Called when the user drops an item onto the diagram.
    /// </summary>
    /// <param name="targetDropElement"></param>
    /// <param name="diagramDragEventArgs"></param>
    public void OnDragDrop(ShapeElement targetDropElement, DiagramDragEventArgs diagramDragEventArgs)
    {
      MefDsl2Diagram diagram = targetDropElement as MefDsl2Diagram;
      if (diagram == null) return;

      // This handler only accepts files dragged from Windows Explorer:
      string[] draggedFileNames = diagramDragEventArgs.Data.GetData("FileNameW") as string[];
      if (draggedFileNames == null || draggedFileNames.Length == 0) return; 

      using (Transaction t = diagram.Store.TransactionManager.BeginTransaction("file names"))
      {
        // Create an element to represent each file:
        foreach (string fileName in draggedFileNames)
        {
          ExampleElement element = new ExampleElement(diagram.ModelElement.Partition);
          element.Name = fileName;

          // This method of adding the new element allows the position
          // of the shape to be specified:          
          ElementGroup group = new ElementGroup(element);
          diagram.ElementOperations.MergeElementGroupPrototype(
            diagram, group.CreatePrototype(), PointD.ToPointF(diagramDragEventArgs.MousePosition));
        }
        t.Commit();
      }
    }
  }
}

Ff972471.collapse_all(tr-tr,VS.110).gifDoğrulama kısıtlamaları

Doğrulama yöntemleri tarafından işaretlenmiş ValidationExtension dsl ve ayrıca göre oluşturulan öznitelik ValidationMethodAttribute.Bir öznitelik işaretlenmemiş herhangi bir sınıf yöntemi görünür.

Daha fazla bilgi için bkz. Bir etki alanına özgü dil doğrulama.

using Company.MyDsl;
using Company.MyDsl.ExtensionEnablement;
using Microsoft.VisualStudio.Modeling.Validation;

namespace MefExtension
{
  class MyValidationExtension // Can be any class.
  {
    // SAMPLE VALIDATION METHOD.
    // All validation methods have the following attributes.

    // Specific to the extended DSL:
    [MyDslValidationExtension] 

    // Determines when validation is applied:
    [ValidationMethod(
       ValidationCategories.Save
     | ValidationCategories.Open
     | ValidationCategories.Menu)]
    
    /// <summary>
    /// When validation is executed, this method is invoked
    /// for every element in the model that is an instance
    /// of the second parameter type.
    /// </summary>
    /// <param name="context">For reporting errors</param>
    /// <param name="elementToValidate"></param>
    private void ValidateClassNames
      (ValidationContext context,
       // Type determines to what elements this will be applied:
       ExampleElement elementToValidate)
    { 
      // Write code here to test values and links.
      if (elementToValidate.Name.IndexOf(' ') >= 0)
      {
        // Log any unacceptable values:
        context.LogError(
          // Description:
          "Name must not contain spaces" 
          // Error code unique to this type of error:
          , "MyDsl001" 
          // Element to highlight when user double-clicks error:
          , elementToValidate); 
} } } }

Ayrıca bkz.

Kavramlar

Managed Extensibility Framework (MEF)

Nasıl yapılır: sürükle ve bırak işleyicisi ekleyin

Bir etki alanına özgü dil doğrulama

Diğer Kaynaklar

VSIX dağıtım