我可以在 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# 的设计时迭代引用的程序集吗?的主要内容,如果未能解决你的问题,请参考以下文章

控制台应用程序可以使用 UWP 程序集吗?

可以在 C#.NET COM 组件中执行或加载程序集吗?

安装 .NET 4.5 真的会取代 .NET 4.0 程序集吗?

引用自定义组件的设计时程序集

如何修复“引用的程序集没有强名称”错误

从 Asp.Net 4 项目进入引用的 .Net 3.5 程序集