Je tente d'écrire un composant .NET. Le composant sera déposé sur un contrôle form/user et devra accéder aux attributs dans les assemblys référencés par le contrôle parent/form du composant lors de la conception. Est-il possible d'obtenir ces assemblages au moment du design?Puis-je itérer les assemblages référencés au moment du design en C#?
Répondre
Ceci est la preuve de concept que j'ai finalement trouvé pour cette question. Ce n'est pas sans défauts mais je crois qu'avec un peu de travail cela fonctionnera correctement.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Reflection;
using System.Windows.Forms;
namespace ReferencedAssemblies
{
public partial class GetReferencedComponents : Component, ISupportInitialize
{
private Control hostingControl;
public GetReferencedComponents(IContainer container) : this()
{
container.Add(this);
}
public GetReferencedComponents()
{
InitializeComponent();
Assemblies = new List<string>();
GetAssemblies();
}
public List<string> Assemblies { get; private set; }
[Browsable(false)]
public Control HostingControl
{
get
{
if (hostingControl == null && this.DesignMode)
{
IDesignerHost designer = this.GetService(typeof(IDesignerHost)) as IDesignerHost;
if (designer != null)
hostingControl = designer.RootComponent as Control;
}
return hostingControl;
}
set
{
if (!this.DesignMode && hostingControl != null && hostingControl != value)
throw new InvalidOperationException("Cannot set at runtime.");
else
hostingControl = value;
}
}
public void BeginInit()
{
}
public void EndInit()
{
// use ISupportInitialize.EndInit() to trigger loading assemblies at design-time.
GetAssemblies();
}
private void GetAssemblies()
{
if (HostingControl != null)
{
if (this.DesignMode)
MessageBox.Show(String.Format("Getting Referenced Assemblies from {0}", HostingControl.Name));
Assemblies.Clear();
AssemblyName[] assemblyNames = HostingControl.GetType().Assembly.GetReferencedAssemblies();
foreach (AssemblyName item in assemblyNames)
Assemblies.Add(item.Name);
}
}
}
}
Merci pour vos réponses!
Mike
Avez-vous essayé d'utiliser Assembly.GetReferencedAssemblies?
EDIT: J'ai annulé ce post car vous n'avez pas reçu d'autres réponses. Quand j'ai répondu à l'origine, je n'avais pas bien lu la question, donc je n'avais pas vu la partie "au moment du design". D'un autre côté, peut-être que cela n'a pas d'importance - cela vous donne au moins quelque chose à essayer. Bonne chance et excuses si c'est une chasse aux oies sauvage.
Visual Studio Automation and Extensibility vous permettriez d'accéder à ce type d'information au moment de la conception, dans le sens où vous pourriez avoir accès aux données au moment de la conception.