我可以在C#中在设计时迭代引用的程序集吗?

时间:2009-01-10 23:31:33

标签: c# components design-time

我正在尝试编写.NET组件。该组件将被删除到表单/用户控件上,并且需要在设计时访问组件父表单/用户控件所引用的程序集中的属性。是否有可能在设计时获得这些组件?

3 个答案:

答案 0 :(得分:1)

Visual Studio Automation and Extensibility允许您在设计时访问这类信息,因为您可以在设计时拥有和加载项访问数据。

答案 1 :(得分:0)

您是否尝试过使用Assembly.GetReferencedAssemblies

编辑:

由于您没有收到任何其他回复,我已删除此帖。当我最初回复时,我没有正确地阅读这个问题,所以没有看到“在设计时”部分。另一方面,也许这无关紧要 - 这至少可以让你尝试一下。

祝你好运,如果这是一场疯狂的追逐,我会道歉。

答案 2 :(得分:0)

这是我最终想出这个问题的概念证明。它并非没有缺陷,但我相信只要做一点工作它就能正常运作。

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);
            }
        }
    }

}

感谢您的回答!

麦克