从项目B中获取项目A的表单名称
本文关键字:项目 表单 获取 | 更新日期: 2023-09-27 18:10:11
我有两个项目在一个解决方案,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
.
我假设您已经正确引用了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);
}
}
}