C# Get form names of project A from Project B

后端 未结 3 806
我寻月下人不归
我寻月下人不归 2021-01-26 11:02

I have two Projects in one solution, project A and project B (using VS2010 Ultimate and C# windows application). Project B ac

相关标签:
3条回答
  • 2021-01-26 11:34

    I'm going to assume you've referenced ProjectA correctly and all the forms you're interested in actually have a public parameterless constructor. The problem is likely caused by ProjectA not being loaded yet, you can fix this in multiple ways. Probably the most direct is to use the static Assembly.Load (as long as the files are in the same directory, if not it gets more complicated).

    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
    }
    

    Another (probably cleaner solution) would be to have all the forms you're interested in inherit from a single base form. You could then load the assembly from that known Type and check that each enumerated Type inherits from it before adding it to your list. This is a more extensive change, however, and touches ProjectA.

    0 讨论(0)
  • 2021-01-26 11:40
    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
            } 
        } 
    } 
    
    0 讨论(0)
  • 2021-01-26 11:53

    Try This Code:

     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);
                    }
                }
    
        }
    
    0 讨论(0)
提交回复
热议问题