首页 技术 正文
技术 2022年11月10日
0 收藏 765 点赞 3,703 浏览 3285 个字

1、类库项目引用System.Windows.Forms并添加引用后,才可创建窗体。

2、控制台应用程序调用中间库(DLL)中的方法创建窗体;中间类库使用反射下的Assembly加载包含窗体的类库及创建实例。

注意:1)创建实例时,参数为窗体类的全名(命名空间+类名)。

     2)返回值是Object类型,需转化为Form类型。

3)exe(控制台程序)、中间类库(dll)、窗体所在类库(dll)在同一目录下。

4)Load(空间名,窗体类全名),LoadFrom(*.dll,窗体类全名)

具体代码如下:

窗体类库:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace TestForm
{
public partial class Test : Form
{
public Test()
{
InitializeComponent();
}
}
}

中间类库:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace Anxin.Factory
{
public class FormFactory
{
/// <summary>
/// 创建窗体
/// </summary>
/// <param name="val_classFullName"></param>
/// <returns></returns>
public static Form CreateForm(string val_classFullName)
{
string nameSpace = val_classFullName.Substring(0,val_classFullName.LastIndexOf('.'));
return (Form)Assembly.Load(nameSpace).CreateInstance(val_classFullName);
} /// <summary>
/// 创建窗体
/// </summary>
/// <param name="val_nameSpace">命名空间</param>
/// <param name="val_className">窗体类名</param>
/// <returns></returns>
public static Form CreateForm(string val_nameSpace, string val_className)
{
//string className = val_className; //仅使用类名创建示例失败。
string classFullName = string.Format("{0}.{1}",val_nameSpace,val_className);
//MessageBox.Show(Assembly.GetExecutingAssembly().Location);
return (Form)Assembly.Load(val_nameSpace).CreateInstance(classFullName);
} public static Form CreateForm(string val_formAssemblyFile, string val_formFullName, Object[] val_formArgs)
{
return CreateForm(val_formAssemblyFile, val_formFullName, val_formArgs, null);
} public static Form CreateForm(string val_formAssemblyFile,string val_formFullName,Object[] val_formArgs,string val_formText)
{
Form form;
string assemblyPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
string assemblyFullName = assemblyPath + val_formAssemblyFile;
if (!assemblyPath.EndsWith("\\"))
{
assemblyFullName = assemblyPath + "\\" + val_formAssemblyFile;
}
//MessageBox.Show(assemblyFullName);
Assembly formAssembly = Assembly.LoadFrom(assemblyFullName);
form = formAssembly.CreateInstance(val_formFullName) as Form;
if(null == form)
{
string strError = string.Format("创建窗体失败!\n程序集{0}\n窗体类名称{1}",
val_formAssemblyFile,
val_formFullName);
if (!string.IsNullOrEmpty(val_formText))
{
strError += "窗体标题" + val_formText;
}
throw new Exception(strError);
} if (!string.IsNullOrEmpty(val_formText))
{
form.Text = val_formText;
} return form;
}
}
}

控制台程序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Anxin.Factory;
using System.Windows.Forms;namespace TestFactory
{
class Program
{
static void Main(string[] args)
{
string nameSpace = "TestForm";
string className = "Test"; //窗体类名
//string className = "Example"; //窗体文件名 (报错)
Form testForm = FormFactory.CreateForm(nameSpace,className); string classFullName = nameSpace + "." + className;
testForm = FormFactory.CreateForm(classFullName); string dllName = "TestForm.dll";
//string classFullName = "TestForm.Test";
testForm = FormFactory.CreateForm(dllName,classFullName,null); string formText = "OK 加油!";
testForm = FormFactory.CreateForm(dllName, classFullName, null,formText); if (null != testForm)
{
testForm.ShowDialog();
}
else
{
Console.WriteLine("通过调用Dll,创建窗体失败!\n");
//使用窗体文件名创建时失败!
}
}
}
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,909
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,434
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,249
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,060
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,692
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,730