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

时间:2013-04-20 09:53:17

标签: c# winforms forms

我在一个解决方案中有两个项目,project Aproject Busing 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//MdiWindowDialogPrintPreview的表单名称。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

试用此代码:

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

    }

答案 2 :(得分:0)

我假设您已正确引用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