我可以在 C# 的设计时迭代引用的程序集吗?
Posted
技术标签:
【中文标题】我可以在 C# 的设计时迭代引用的程序集吗?【英文标题】:Can I iterate referenced assemblies at design-time in C#? 【发布时间】:2010-09-30 17:24:00 【问题描述】:我正在尝试编写一个 .NET 组件。组件将被拖放到窗体/用户控件上,并且需要在设计时访问组件父窗体/用户控件引用的程序集中的属性。是否有可能在设计时获得这些程序集?
【问题讨论】:
【参考方案1】:您是否尝试过使用Assembly.GetReferencedAssemblies?
编辑:
我取消了删除此帖子,因为您没有任何其他回复。当我最初回答时,我没有正确阅读问题,所以没有看到“设计时”部分。另一方面,也许这无关紧要——这至少可以让你尝试一下。
祝你好运,如果这是一场疯狂的追逐,我们深表歉意。
【讨论】:
【参考方案2】:Visual Studio Automation and Extensibility 将允许您在设计时访问此类信息,从某种意义上说,您可以在设计时拥有和加载项访问数据。
【讨论】:
【参考方案3】:这是我最终为这个问题提出的概念证明。它并非没有缺陷,但我相信只要稍加努力,它就会正常运行。
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);
感谢您的回答!
迈克
【讨论】:
以上是关于我可以在 C# 的设计时迭代引用的程序集吗?的主要内容,如果未能解决你的问题,请参考以下文章