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