Могу ли я повторять сборки, на которые ссылаются, во время разработки в C#?

Я пытаюсь написать компонент .NET. Компонент будет помещен в форму/пользовательский элемент управления, и ему потребуется доступ к атрибутам в сборках, на которые ссылается родительская форма/пользовательский элемент управления компонентов во время разработки. Можно ли получить эти сборки во время разработки?


person mreith    schedule 10.01.2009    source источник


Ответы (3)


Visual Studio Automation and Extensibility позволит вам получить доступ к такой информации во время разработки, в том смысле, что вы могли бы иметь доступ к данным во время разработки.

person cmsjr    schedule 11.01.2009

Это доказательство концепции, которую я наконец придумал для этого вопроса. Он не без недостатков, но я думаю, что при небольшой доработке он будет работать должным образом.

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

}

Спасибо за ваши ответы!

Майк

person mreith    schedule 14.01.2009

Пробовали ли вы использовать Assembly.GetReferencedAssemblies?

РЕДАКТИРОВАТЬ:

Я восстановил это сообщение, так как у вас не было других ответов. Когда я первоначально ответил, я не прочитал вопрос должным образом, поэтому не видел часть во время разработки. С другой стороны, может быть, это и не имеет значения — это, по крайней мере, дает вам возможность попробовать.

Удачи, и извините, если это пустая охота.

person Jon Skeet    schedule 10.01.2009