从dll程序集中获取方法和属性

时间:2017-06-01 16:18:00

标签: c# dll reflection .net-assembly

我正在尝试通过反映提供我的类Plugin的dll文件来运行一个小插件机制(实现我的Plugin - 在dll和主项目之间共享的接口/抱歉同样命名)提供string类型的属性和主方法activate

接口:

public interface Plugin
{
    string pluginName{get;set;}
    void activate(System.Windows.Forms.Form main);
}

dll class:

    public class Plugin : WhiteA.Plugin
        {
            public string pluginName{get;set;}

            public void activate(System.Windows.Forms.Form main){
                //find the right form to modify it
                IEnumerable<System.Windows.Forms.ComboBox> ie= GetControlsOfType<System.Windows.Forms.ComboBox>(main);
                System.Windows.Forms.ComboBox cb=GetControlsOfType<System.Windows.Forms.ComboBox>(main).FirstOrDefault();
                cb.Items.Add("Modification");
                System.Windows.Forms.MessageBox.Show(cb.SelectedItem.ToString());
            }

            public static IEnumerable<T> GetControlsOfType<T>(System.Windows.Forms.Control root)
                where T : System.Windows.Forms.Control
            {
                var t = root as T;
                if (t != null)
                    yield return t;

                var container = root as System.Windows.Forms.ContainerControl;
                if (container != null)
                    foreach (System.Windows.Forms.Control c in container.Controls)
                        foreach (var i in GetControlsOfType<T>(c))
                            yield return i;
            }
        }

所以问题就出现了,在程序集中找不到名为type的{​​{1}}。试图从目录中的所有程序集中获取所有类型,从中获取所有方法/成员/自定义属性,记录它们等,但是没有找到我的类"Plugin",而dll肯定是发现,因为它没有返回Plugin

MessageBox

我知道我的代码对你们所有人来说可能看起来很麻烦 - 我认为最后string[] files=new string[]{}; string path="Error retrieving path"; try{ path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); files = System.IO.Directory.GetFiles(path, "*.dll"); }catch(Exception exF){ } if(files.Length>0){ foreach (string dll in files){ try{ System.Reflection.Assembly sampleAssembly = System.Reflection.Assembly.LoadFrom(dll); Type myType = sampleAssembly.GetType("Plugin"); System.Reflection.MethodInfo method = myType.GetMethod("activate"); object myInstance = Activator.CreateInstance(myType); method.Invoke(myInstance, new object[]{this}); }catch(Exception exL){ } } }else{ MessageBox.Show("No working plugins detected in " + path.ToString(), "Nothing to activate", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1); } - 块是唯一相关的东西,想要放入类本身和接口以获得一点透明度 - 我的英语并不完美,但我希望有人可以帮我在程序集中找到我的属性+方法。

修改

try

我确实根据Getting all types in a namespace via reflection进行了更改 结果还是一样,我做错了什么?

1 个答案:

答案 0 :(得分:0)

正如@stuartd 所指出的那样:

Type myType = sampleAssembly.GetType("WhiteA_Plugin_PausedVideo.Plugin");

是解决方案,错过了命名空间

cb.Items.Add("Modification");

虽然没有工作......有什么建议吗?

让它工作通过Controls [&#34; nameOfChild&#34;]直接获取表单的子项,这个帮助方法按类获取所有对象似乎是错误的

插件现在可以使用了,谢谢!