Я пытаюсь написать компонент .NET. Компонент будет помещен в форму/пользовательский элемент управления, и ему потребуется доступ к атрибутам в сборках, на которые ссылается родительская форма/пользовательский элемент управления компонентов во время разработки. Можно ли получить эти сборки во время разработки?
Могу ли я повторять сборки, на которые ссылаются, во время разработки в C#?
Ответы (3)
Visual Studio Automation and Extensibility позволит вам получить доступ к такой информации во время разработки, в том смысле, что вы могли бы иметь доступ к данным во время разработки.
Это доказательство концепции, которую я наконец придумал для этого вопроса. Он не без недостатков, но я думаю, что при небольшой доработке он будет работать должным образом.
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);
}
}
}
}
Спасибо за ваши ответы!
Майк
Пробовали ли вы использовать Assembly.GetReferencedAssemblies?
РЕДАКТИРОВАТЬ:
Я восстановил это сообщение, так как у вас не было других ответов. Когда я первоначально ответил, я не прочитал вопрос должным образом, поэтому не видел часть во время разработки. С другой стороны, может быть, это и не имеет значения — это, по крайней мере, дает вам возможность попробовать.
Удачи, и извините, если это пустая охота.