Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Yönetilen Genişletilebilirlik Çerçevesi (MEF) kullanarak etki alanına özgü dilinizi (DSL) genişletebilirsiniz. Siz veya diğer geliştiriciler DSL tanımını ve program kodunu değiştirmeden DSL için uzantılar yazabileceksiniz. Bu tür uzantılar menü komutlarını, sürükle ve bırak işleyicilerini ve doğrulamayı içerir. Kullanıcılar DSL'nizi yükleyebilir ve ardından isteğe bağlı olarak bunun için uzantılar yükleyebilir.
Buna ek olarak, DSL'nizde MEF'yi etkinleştirdiğinizde, DSL'nizle birlikte oluşturulmuş olsalar bile DSL'nizin bazı özelliklerini yazmanız daha kolay olabilir.
MEF hakkında daha fazla bilgi için bkz . Yönetilen Genişletilebilirlik Çerçevesi (MEF).
DSL'nizin MEF tarafından genişletilebilmesini sağlamak için
DslPackage projesinde MefExtension adlı yeni bir klasör oluşturun. Aşağıdaki dosyaları ekleyin:
Dosya adı:
CommandExtensionVSCT.tt
Önemli
Bu dosyadaki GUID değerini DslPackage\GeneratedCode\Constants.tt içinde tanımlanan GUID CommandSetId değeriyle 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" #>
Dosya adı:
CommandExtensionRegistrar.tt
<#@ Dsl processor="DslDirectiveProcessor" requires="fileName='..\..\Dsl\DslDefinition.dsl'" #> <#@ include file="DslPackage\CommandExtensionRegistrar.tt" #>
Dosya adı:
ValidationExtensionEnablement.tt
<#@ Dsl processor="DslDirectiveProcessor" requires="fileName='..\..\Dsl\DslDefinition.dsl'" #> <#@ include file="DslPackage\ValidationExtensionEnablement.tt" #>
Dosya adı:
ValidationExtensionRegistrar.tt
Bu dosyayı eklerseniz, DSL Gezgini'nde EditorValidation anahtarlarından en az birini kullanarak DSL'nizde doğrulamayı etkinleştirmeniz gerekir.
<#@ Dsl processor="DslDirectiveProcessor" requires="fileName='..\..\Dsl\DslDefinition.dsl'" #> <#@ include file="DslPackage\ValidationExtensionRegistrar.tt" #>
Dosya adı:
PackageExtensionEnablement.tt
<#@ Dsl processor="DslDirectiveProcessor" requires="fileName='..\..\Dsl\DslDefinition.dsl'" #> <#@ include file="DslPackage\PackageExtensionEnablement.tt" #>
Dsl projesinde MefExtension adlı yeni bir klasör oluşturun. Aşağıdaki dosyaları ekleyin:
Dosya adı:
DesignerExtensionMetaDataAttribute.tt
<#@ Dsl processor="DslDirectiveProcessor" requires="fileName='..\..\Dsl\DslDefinition.dsl'" #> <#@ include file="Dsl\DesignerExtensionMetadataAttribute.tt" #>
Dosya adı:
GestureExtensionEnablement.tt
<#@ Dsl processor="DslDirectiveProcessor" requires="fileName='..\..\Dsl\DslDefinition.dsl'" #> <#@ include file="Dsl\GestureExtensionEnablement.tt" #>
Dosya adı:
GestureExtensionController.tt
<#@ Dsl processor="DslDirectiveProcessor" requires="fileName='..\..\Dsl\DslDefinition.dsl'" #> <#@ include file="Dsl\GestureExtensionController.tt" #>
DslPackage\Commands.vsct adlı mevcut dosyaya aşağıdaki satırı ekleyin:
<Include href="MefExtension\CommandExtensionVSCT.vsct"/>
Varolan
<Include>
yönergeden sonra satırı ekleyin.DslDefinition.dsl dosyasını açın.
DSL Gezgini'nde Düzenleyici\Doğrulama'yı seçin.
Özellikler penceresi, Uses adlı özelliklerden en az birinin olduğundan
true
emin olun.Çözüm Gezgini araç çubuğunda Tüm Şablonları Dönüştür'e tıklayın.
Yan dosyalar, eklediğiniz dosyaların her birinin altında görünür.
Hala çalıştığını doğrulamak için çözümü derleyin ve çalıştırın.
DSL'niz artık MEF özelliklidir. Menü komutlarını, hareket işleyicilerini ve doğrulama kısıtlamalarını MEF uzantıları olarak yazabilirsiniz. Bu uzantıları DSL çözümünüzde diğer özel kodlarla birlikte yazabilirsiniz. Buna ek olarak, siz veya diğer geliştiriciler DSL'nizi genişleten ayrı Visual Studio uzantıları yazabilirsiniz.
MEF özellikli DSL için uzantı oluşturma
Kendiniz veya başka biri tarafından oluşturulan MEF özellikli BIR DSL'ye erişiminiz varsa bunun için uzantılar yazabilirsiniz. Uzantılar menü komutları, hareket işleyicileri veya doğrulama kısıtlamaları eklemek için kullanılabilir. Bu uzantıları yazmak için bir Visual Studio uzantısı (VSIX) çözümü kullanırsınız. Çözümün iki bölümü vardır: kod derlemesini oluşturan bir sınıf kitaplığı projesi ve derlemeyi paketleyen bir VSIX projesi.
DSL uzantısı VSIX oluşturmak için
Yeni bir Sınıf Kitaplığı projesi oluşturun.
Yeni projede DSL derlemesine bir başvuru ekleyin.
Bu derleme genellikle "ile biten bir ada sahiptir. Dsl.dll".
DSL projesine erişiminiz varsa, derleme dosyasını Dsl\bin\* dizininde bulabilirsiniz
DSL VSIX dosyasına erişiminiz varsa, VSIX dosyasının dosya adı uzantısını ".zip" olarak değiştirerek derlemeyi bulabilirsiniz. .zip dosyasının sıkıştırmasını kaldırın.
Aşağıdaki .NET derlemelerine başvurular ekleyin:
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
Yeni bir VSIX proje projesi oluşturun.
Çözüm Gezgini'da VSIX projesine sağ tıklayın ve Başlangıç Projesi Olarak Ayarla'yı seçin.
Yeni projede open source.extension.vsixmanifest.
İçerik Ekle'ye tıklayın. İletişim kutusunda İçerik Türü'nü MEF Bileşeni, Kaynak Proje'yi ise sınıf kitaplığı projeniz olarak ayarlayın.
DSL'ye bir VSIX başvurusu ekleyin.
source.extension.vsixmanifest dosyasında Başvuru Ekle'ye tıklayın
İletişim kutusunda Yük Ekle'ye tıklayın ve DSL'nin VSIX dosyasını bulun. VSIX dosyası DSL çözümünde, DslPackage\bin\* içinde yerleşiktir.
Bu, kullanıcıların DSL'yi ve uzantınızı aynı anda yüklemesine olanak tanır. Kullanıcı DSL'yi zaten yüklemişse yalnızca sizin uzantınız yüklenir.
source.extension.vsixmanifest'in diğer alanlarını gözden geçirin ve güncelleştirin. Sürümleri Seç'e tıklayın ve doğru Visual Studio sürümlerinin ayarlandığını doğrulayın.
Sınıf kitaplığı projesine kod ekleyin. Sonraki bölümdeki örnekleri kılavuz olarak kullanın.
İstediğiniz sayıda komut, hareket ve doğrulama sınıfı ekleyebilirsiniz.
Uzantıyı test etmek için F5 tuşuna basın. Visual Studio'nun deneysel örneğinde DSL'nin örnek bir dosyasını oluşturun veya açın.
DLL'ler için MEF uzantıları yazma
Uzantıları ayrı bir DSL uzantısı çözümünün derleme kodu projesinde yazabilirsiniz. DSLPackage projenizde, DSL'nin bir parçası olarak komutlar, hareketler ve doğrulama kodu yazmanın kullanışlı bir yolu olarak MEF de kullanabilirsiniz.
Menü Komutları
Menü komutu yazmak için, sınıfı uygulayan ICommandExtension bir sınıf tanımlayın ve sınıfın ön ekini DSL'nizde tanımlanan YourDslCommandExtension
adlı öznitelikle belirleyin. Birden fazla menü komut sınıfı yazabilirsiniz.
QueryStatus()
, kullanıcı diyagrama sağ tıklayışında çağrılır. Geçerli seçimi incelemeli ve komutun ne zaman uygun olduğunu gösterecek şekilde ayarlanmalıdır command.Enabled
.
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"; }
}
}
}
Hareket İşleyicileri
Hareket işleyicisi, diyagrama sürüklenen nesnelerle Visual Studio içinde veya dışından her yerden ilgilenebilir. Aşağıdaki örnek, kullanıcının dosyaları Windows Gezgini'nden diyagrama sürüklemesine olanak tanır. Dosya adlarını içeren öğeler oluşturur.
Diğer DSL modellerinden ve UML modellerinden sürüklenmelerle başa çıkmak için işleyiciler yazabilirsiniz. Daha fazla bilgi için bkz . Nasıl yapılır: Sürükle ve Bırak İşleyicisi Ekleme.
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();
}
}
}
}
Doğrulama kısıtlamaları
Doğrulama yöntemleri DSL tarafından ValidationExtension
oluşturulan özniteliği ve ayrıca tarafından ValidationMethodAttributeişaretlenir. yöntemi, bir öznitelik tarafından işaretlenmemiş herhangi bir sınıfta görüntülenebilir.
Daha fazla bilgi için bkz . Etki Alanına Özgü Dilde 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);
} } } }