2009-10-27 4 views
4

J'ai une bibliothèque d'extensibilité (ou le début d'une), avec un UITypeEditor. Je voudrais maintenant décorer la propriété avec le EditorAttribute. Je ne veux pas faire référence à la bibliothèque d'extensibilité, car il n'a pas besoin d'être déployé, donc je suis en utilisant ceci:Comment un assemblage est-il résolu au moment du design?

[Editor("MyProject.Extensibility.MyUIEditor, MyProject.Extensibility, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", typeof (UITypeEditor))] 
MySpecialType SpecialType { get; set; } 

Cela ne fonctionne pas. L'éditeur de type est à utiliser sur les énumérations et quand je l'utilise, le menu déroulant enum standard est affiché. Toutefois, si vous copiez l'éditeur de type dans le projet et utilisez une référence de type direct, tout fonctionne correctement. J'ai essayé de tester ma chaîne en utilisant Activator.CreateInstance et je l'ai pour que ça fonctionne. Le MyProject.Extensibility.dll est copié à peu près partout (tous les dossiers de bin/débogage du projet). Y at-il un endroit spécial pour mettre une DLL d'extensibilité afin que .net puisse résoudre l'assemblage?

Merci!

Répondre

4

Entrez simplement Regedit.exe et créer une clé juste comme:

 
HKLM\SOFTWARE\Microsoft\.NETFramework\v2.0.50727\AssemblyFoldersEx\StackOverflow 

Il ne compte pas vraiment ce que le nom de la clé est, tous les noms de dossiers répertoriés dans les AssemblyFoldersEx sont recherchés pour la conception-temps Assemblées par Visual Studio.

Un dossier doit être ajouté dans Regedit à l'aide d'une entrée (par défaut) ayant comme valeur le chemin du dossier. (Voir les clés de sibling par exemple).

Il est intéressant que tous les dossiers présents dans la clé de Registre AssemblyFoldersEx apparaissent automatiquement lorsque vous cliquez sur "Ajouter une nouvelle référence" dans un menu contextuel du projet dans l'onglet .NET.

Une autre approche serait d'ajouter l'assemblage souhaité Global Access Cache (c: \ Windows \ Assembly)

Je viens de faire le test suivant: Sur un ensemble de ressources que je mets le code suivant:

public class MyEditor : UITypeEditor 
{ 
    public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context) 
    { 
     return UITypeEditorEditStyle.Modal; 
    } 

    public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, IServiceProvider provider, object value) 
    { 
     MessageBox.Show("Works"); 
     return null; 
    } 
} 

Sur l'ensemble de la consommation (Windows forme assembly exécutable) J'ai créé un composant qui dérive de bouton comme ceci:

public class MyButton : Button 
{ 
    [Editor("AssemblyReferenceCL.MyEditor, AssemblyReferenceCL", typeof(UITypeEditor))] 
    public String MyProp { get; set; } 
} 

Il n'y a pas de référence entre les deux assemblées. Tout a bien fonctionné.

+0

Merci! Le MessageBox.Show n'a pas fonctionné dans ma tentative, a continué à obtenir une exception de référence null. Cependant, j'ai fait travailler un éditeur modal, dans un autre projet, aucune référence utilisant le paramètre de registre. Merci encore! –

Questions connexes