2

.NET コンポーネントを作成しようとしています。コンポーネントはフォーム/ユーザー コントロールにドロップされ、設計時にコンポーネントの親フォーム/ユーザー コントロールによって参照されるアセンブリ内の属性にアクセスする必要があります。設計時にこれらのアセンブリを取得することは可能ですか?

4

3 に答える 3

1

Visual Studio Automation and Extensibilityを使用すると、設計時にデータにアドイン アクセスできるという意味で、設計時にそのような情報にアクセスできます。

于 2009-01-11T00:29:11.463 に答える
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);
            }
        }
    }

}

回答ありがとうございます。

マイク

于 2009-01-14T03:43:38.620 に答える
0

Assembly.GetReferencedAssembliesを使用してみましたか?

編集:

他に返信がなかったので、この投稿の削除を取り消しました。最初に返信したとき、質問をきちんと読んでいなかったので、「設計時」の部分を見ていませんでした。一方で、それは問題ではないかもしれません - これは少なくともあなたに試してみる何かを与えます.

幸運を祈ります。野生のガチョウの追跡である場合はお詫び申し上げます。

于 2009-01-10T23:38:14.983 に答える