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");
//使用窗体文件名创建时失败!
}
}
}
}

C#:控制台程序调用中间库创建窗体的更多相关文章

  1. VisualStudioCode中用dotnet命令创建多个ASP.NET Core 项目、类库、控制台程序,并添加应用间的引用

    一.准备工作 首先安装VisualStudioCode并且可以使用. 1.首先新创建空的MyApps文件夹,作为项目主目录,下面将在这个文件夹中创建多个web应用程序.类型.控制台程序等. 2.打开V ...

  2. 控制台程序秒变Windows服务(Topshelf)

    项目中有些时候需要写服务,一般我们都是先创建控制台程序,测试,运行,成功之后再创建windows服务程序,这样好麻烦啊,有没有简单的控制台程序直接变成Widnows服务,经过查找,找到了Topshel ...

  3. C# - VS2019调用AForge库实现调用摄像头拍照功能

    前言 作为一名资深Delphi7程序员,想要实现摄像头扫描一维码/二维码功能,发现所有免费的第三方库都没有简便的实现办法,通用的OpenCV或者ZXing库基本上只支持XE以上的版本,而且一维码的识别 ...

  4. C#让控制台程序不显示闪退窗口的方法

    新建一个控制台程序,然后编译为 窗体程序.即可........

  5. # 2017-2018-2 20155228 《信息安全系统设计原理》 使用VirtualStudio2008创建和调用静态库和使用VirtualC++6.0创建和调用动态库

    使用virtual c++ 6.0创建和调用动态库 不得不说一下关于环境的问题 只要我打一个响指,一半的安装在win7上的VC6.0都会因为兼容性问题直接崩掉 懒得研究怎么解决兼容性的问题了,直接开一 ...

  6. C运行时库(C Run-time Library)详解(提供的另一个最重要的功能是为应用程序添加启动函数。Visual C++对控制台程序默认使用单线程的静态链接库,而MFC中的CFile类已暗藏了多线程)

    一.什么是C运行时库 1)C运行时库就是 C run-time library,是 C 而非 C++ 语言世界的概念:取这个名字就是因为你的 C 程序运行时需要这些库中的函数. 2)C 语言是所谓的“ ...

  7. VC 静态库与动态库(四)动态库创建与使用_显示调用

    在第三章的基础上,接着添加一个显示调用项目 显示调用项目创建: 1.给解决方案添加一个新的控制台项目DisplayCall用于测试动态库,创建完成后设置为启动项目 2.DisplayCall.cpp添 ...

  8. windows下Qt Creator5.1.0编写程序以及调用OpenCV库

    系统说明 最近使用opencv编写程序,程序编的差不多就学习使用QT加个界面,首先声明下本人的系统和使用的软件版本, 系统: windows xp QT IDE:QT Creator5.1.0 Ope ...

  9. winfrom窗体加载控制台程序,可以自定义输出语句颜色

    winfrom窗体加载控制台程序,可以自定方输出语句颜色,如下图所示 怎么实现的此功能,网上有大把的方法,我这里已经把方法打包成了一个类,只需要引用调用就可以使用了,写的比较粗糙,如有发现需要改进的地 ...

随机推荐

  1. Sublime text 3 SVN插件及使用方法

    前提是你电脑里已装有SVN,这时只是设置快捷调用SVN. 1.通过快捷键 ctrl+` 或者 View > Show Console 菜单打开控制台 2.粘贴对应版本的代码后回车安装 适用于 S ...

  2. iOS 瀑布流的Demo

    /** * 瀑布流Demo的主要代码,若想看完整的代码请到下面链接去下载 * * 链接: https://pan.baidu.com/s/1slByAHB 密码: r3q6 */ #import &l ...

  3. Oracle 11g RAC INS-06006 Passwordless SSH connectivity not set up between the following node(s)

    安装11g RAC的grid时,在Test互信的时候报错INS-06006 Passwordless SSH connectivity not set up between the following ...

  4. java io读书笔记(4)字符数据

    Number只是java程序中需要读出和写入的一种数据类型.很多java程序需要处理有一大堆的字符组成的text,因为计算机真正懂得的只有数字,因此,字符按照某种编码规则,和数字对应. 比如:在ASC ...

  5. log4j使用

    Spring中在src/main/resources下创建log4j.xml 或log4j.properties,在maven下打包时resources文件夹下面的文件会自动copy到WEB-INF/ ...

  6. map容器

    map容器一般用于对字符串进行编号,主要用于建图方面,例如把城市名按数字进行编号 #include"stdio.h" #include"string.h" #i ...

  7. [原创] 分享一些linux教程

    书<鸟哥的linux私房菜第三版>,链接:http://pan.baidu.com/s/1i3femnr 配套视频,链接:http://pan.baidu.com/s/1v72xw --- ...

  8. PHP内核探索:哈希碰撞攻击是什么?

    最近哈希表碰撞攻击(Hashtable collisions as DOS attack)的话题不断被提起,各种语言纷纷中招.本文结合PHP内核源码,聊一聊这种攻击的原理及实现. 哈希表碰撞攻击的基本 ...

  9. java多线程实现卖票小程序

    package shb.java.demo; /** * 多线程测试卖票小程序. * @Package:shb.java.demo * @Description: * @author shaobn * ...

  10. 夺命雷公狗---linux之centos的安装

    由于要玩node.js了,所以还是来复习下linux系统才行,所以夺命雷公狗分享两套安装linux的方法,这是centos的安装方法,,, 管理员默认帐号为:root,密码则是刚才您输入的那个...