从项目B中获取项目A的表单名称

本文关键字:项目 表单 获取 | 更新日期: 2023-09-27 18:10:11

我有两个项目在一个解决方案,project Aproject B (using VS2010 Ultimate and C# windows application)。Project B作为project A的用户管理应用。在project B中,我有一个包含chekcedlistbox控件的表单,该控件将列出所有project A表单的名称和文本(此表单将允许系统管理员根据用户的安全组授予允许查看/编辑的表单)这是我的代码:

   private void GetFormNames()
    {
        foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies())
        {
            foreach (Type t in a.GetTypes())
            {
                if (t.BaseType == typeof(Form))
                {
                    var emptyCtor = t.GetConstructor(Type.EmptyTypes);
                    if (emptyCtor != null)
                    {
                        var f = (Form)emptyCtor.Invoke(new object[] { });
                        string FormText = f.Text;
                        string FormName = f.Name;
                        checkedListBox1.Items.Add("" + FormText + "//" + FormName + "");
                    }
                }
            }
        }
    }

我得到的结果是我当前项目的形式名称(B)和空行(//)和Select Window//MdiWindowDialog, PrintPreview .

从项目B中获取项目A的表单名称

我假设您已经正确引用了ProjectA,并且您感兴趣的所有表单实际上都有一个public无参数构造函数。这个问题很可能是由于ProjectA尚未加载引起的,您可以通过多种方式解决这个问题。可能最直接的是使用static Assembly.Load(只要文件在同一目录中,否则会变得更复杂)。

try
{
    Assembly projectA = Assembly.Load("ProjectA"); // replace with actual ProjectA name 
    // despite all Microsoft's dire warnings about loading from a simple name,
    // you should be fine here as long as you don't have multiple versions of ProjectA
    // floating around
    foreach (Type t in projectA.GetTypes())
    {
        if (t.BaseType == typeof(Form))
        {
            var emptyCtor = t.GetConstructor(Type.EmptyTypes);
            if (emptyCtor != null)
            {
                var f = (Form)emptyCtor.Invoke(new object[] { });
                // t.FullName will help distinguish the unwanted entries and
                // possibly later ignore them
                string formItem = t.FullName + " // " + f.Text + " // " + f.Name;
                checkedListBox1.Items.Add(formItem);
            }
        }
    }
}
catch(Exception err)
{
    // log exception
}

另一个(可能更简洁的解决方案)是让您感兴趣的所有表单都从一个基本表单继承。然后,您可以从已知的Type加载程序集,并在将其添加到列表之前检查每个枚举的Type是否继承自它。然而,这是一个更广泛的更改,并且涉及ProjectA

Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); 
foreach (Assembly a in assemblies) 
{ 
    Type[] types = a.GetTypes(); 
    foreach (Type t in types) 
    { 
        if (t.BaseType == typeof(Form)) 
        { 
                  //Do Your works
        } 
    } 
} 

试试这个代码:

 private void GetFormNames()
    {

        Type[] AllTypesInProjects = Assembly.GetExecutingAssembly().GetTypes();
            for (int i = 0; i < AllTypesInProjects.Length; i++)
            {
                if (AllTypesInProjects[i].BaseType == typeof(Form))
                {            /* Convert Type to Object */
                    Form f = (Form)Activator.CreateInstance(AllTypesInProjects[i]);
                    string FormText = f.Text; 
                    listBox1.Items.Add(FormText);
                }
            }
    }