介绍

这是本人毕业设计的项目,一直想将其整理成文,可一不小心4年就过去了(这个时间又可以读个大学了)。现在给自己定一个目标,一个月时间里将项目的所有关键点都整理出来。不然真怕一眨眼又一个4年过去了,而代码依然躺在硬盘里。

项目取名MathAssist,使用vs2008。分成四个子项目:

  1. MathAssistLibrary    提供一个接口,以便实现用dll拓展的插件机制
  2. SuperCalculator   实现任意大数计算的插件
  3. 命令证明              实现简单逻辑命题证明的插件
  4. MathAssist          主程序,会扫描并加载其路径下所有符合条件的dll

其主程序可以从插件中扫描可用的命令,也可以显示插件中可用的窗体。如下是主程序界面,其加载了两个插件:“superCalculator”和“命令证明”。它们分别提供命令cal prove。

点击菜单项"插件"的子菜单后可以分别打开两个插件中实现的窗口。如下图

分别实现了大数计算和逻辑命题的证明。

在这篇前言中就先只介绍插件机制的实现吧,大数计算和逻辑命题的证明就留给后面的系列。

插件机制的实现

MathAssistLibrary接口的定义

在MathAssistLibrary项目中只定义了两个接口: ICommand, IForm,分别用于提供命令行功能和窗口功能。

     /// <summary>命令接口</summary>
public interface ICommand
{
/// <summary>命令名称</summary>
string Name { get; } /// <summary>执行命令</summary>
/// <param name="cmd">命令参数</param>
/// <returns>返回的结果</returns>
string Excute( string cmd ); /// <summary>对命令的使用作相应的说明</summary>
string Describe { get; }
}
/// <summary>获得插件的窗体</summary>
public interface IForm
{
/// <summary>窗体名</summary>
string Text { get; } /// <summary>窗体对象</summary>
Form GetForm { get; }
}

MathAssistLibrary

ICommand接口

  • Name 用于表示命令的名称
  • Excute 用于执行命令
  • Describe 用于对这个命令提供一个简要的帮助文档说明

IForm接口

  • Text 用于表示窗体的名称
  • GetForm 用于获取Form对象。在主程序中获取Form对象后,再调用Show()即可显示之。

插件实现

在插件项目中只要实现ICommand和IForm两个接口即可,以SuperCalculator为例:

public partial class frmSuperCalculator : Form, IForm
{
string IForm.Text {
get { return "计算器"; }
} frmSuperCalculator frm;
Form IForm.GetForm {
get {
if (frm == null || frm.IsDisposed) {
frm = new frmSuperCalculator();
}
return frm;
}
}
...
}
public class Calculator : MathAssistLibrary.ICommand
{
string MathAssistLibrary.ICommand.Describe {
get { return "cal命令可以进行相关的数学运算。比如cal 1+max(2,3)*2"; }
}
string MathAssistLibrary.ICommand.Name {
get { return "cal"; }
}
string MathAssistLibrary.ICommand.Excute(string cmd) {
try {
Expression exp = new Expression();
exp.Format = cmd;
return exp.Calculator().ToString();
} catch (ExpressionException e) {
return string.Format("表达式出错。出错类型:{0},出错位置{1}", e.Message, e.Index);
}
}
}

主程序对插件的扫描

FindDllFile()函数找到与程序同路径下的所有dll文件,代码如下:

         List<string> FindDllFile(string foldername) {
DirectoryInfo dir = new DirectoryInfo(foldername);
FileInfo[] files = dir.GetFiles();
List<string> result = new List<string>(); foreach (FileInfo fi in files) {
if (fi.Name.ToUpper().EndsWith(".DLL"))
result.Add(fi.FullName);
}
return result;
}

FindDllFile

LoadOne()从一个文件中找一个特定的类型,并返回其对象,代码如下:

        private List<object> LoadOne(string filename, Type type) {
List<object> result = new List<object>(); try {
Assembly ass = Assembly.LoadFrom(filename);
Module[] mods = ass.GetModules(); foreach (Module mod in mods) {
Type[] typs = mod.GetTypes(); foreach (Type typ in typs) {
if (type.IsAssignableFrom(typ)) {
result.Add(ass.CreateInstance(typ.FullName));
}
}
}
} catch (BadImageFormatException) { }
return result;
} // end func

先用Assembly.LoadFrom()加载程序集,然后获取所有模块,最后在所有模块中用type.IsAssignableFrom()找与传入参数type相匹配的类型,如果匹配那么就创建一个对象并返回。

在主程序中分别用如下两行代码调用LoadOne()

List<object> cmd = LoadOne(filename, typeof(ICommand));
List<object> frm = LoadOne(filename, typeof(IForm));

这样用cmd.Excute()就可以执行插件中实现的代码,用frm.Show()就可以显示插件中所实现的窗体。

现提供MathAssist.exe的下载路径。在后面的文章中会给出整个程序的源码,敬请期待~~

参数文献:  http://www.cnblogs.com/conexpress/archive/2009/03/04/MyCalculator_01.html

C#实现任意大数的计算和简单逻辑命题的证明——前言的更多相关文章

  1. boost计算随机数和计算crc32简单示例 - jwybobo2007的专栏 - 博客频道 - CSDN.NET

    boost计算随机数和计算crc32简单示例 - jwybobo2007的专栏 - 博客频道 - CSDN.NET     boost::crc_32_type crc32;       crc32. ...

  2. boost计算随机数和计算crc32简单示例

    boost计算随机数和计算crc32简单示例 - jwybobo2007的专栏 - 博客频道 - CSDN.NET boost计算随机数和计算crc32简单示例 2013-02-18 17:14 10 ...

  3. C++算法之大数加法计算的代码

    如下代码段是关于C++算法之大数加法计算的代码,希望对大家有用. { int length; int index; int smaller; int prefix = 0; if(NULL == sr ...

  4. JQuery插件让图片旋转任意角度且代码极其简单 - 摘自网友

    JQuery插件让图片旋转任意角度且代码极其简单 2012-04-01 09:57:03     我来说两句      收藏    我要投稿 引入下方的jquery.rotate.js文件,然后通过$ ...

  5. ASP.NET中登录功能的简单逻辑设计

     ASP.NET中登录功能的简单逻辑设计                               概述                               逻辑设计             ...

  6. Android计算器简单逻辑实现

    Android计算器简单逻辑实现 引言: 我的android计算器的实现方式是:按钮输入一次,就处理一次. 但是如果你学过数据结构(栈),就可以使用表达式解析(前缀,后缀)处理. 而这个方式已经很成熟 ...

  7. Scrapy爬取小说简单逻辑

    Scrapy爬取小说简单逻辑 一 准备工作 1)安装Python 2)安装PIP 3)安装scrapy 4)安装pywin32 5)安装VCForPython27.exe ........... 具体 ...

  8. python的一个表达式的计算(超简单)

    运行的过程如下: 输入计算表达式:3+5 计算结果:8 然后再次显示计算表达式,等待输入完成后,再次显示结果,依此循环.   作为初学者再适合不过,代码也简单,如下所示: #!/usr/bin/env ...

  9. MDX Cookbook 12 - 计算 SMA 简单移动平均 LastPeriods() 函数的使用

    先认识一下这几个名词 Moving Average (MA) 移动平均,或者叫做移动平均线,是技术分析中一种分析时间序列数据的工具.最常见的就是利用股价,回报或交易量等变数计算出移动平均.可以利用移动 ...

随机推荐

  1. em 和 px相互转换

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  2. Eclipse下.project和.classpath作用(转)

    classpath作用 定义项目的结构,如src.output.con.lib等. 源文件的具体位置(kind="src") 运行的系统环境(kind="con" ...

  3. oracle length and lengthb

    LENGTH──返回以字符为单位的字符串长度. LENGTHB──返回以字节为单位的字符串长度,它和类型定义中的长度是一个概念,比如你定义的varchar2(10)中的10.在不同的数据库,因为字符集 ...

  4. esxi 6 虚拟机安装复制

    打开VMware vSphere Client 连接到esxi服务器,选择配置-存储器, 右击存储器标识,选择浏览存储数据, 首先新建一个文件夹,用来存放系统镜像,这里新建了iso文件夹, 选择iso ...

  5. SpringMvc静态资源加载出错

    使用mvc:resource配置 web.xml配置是rest风格的/ 服务器启动没问题 访问地址是报404 另外用了default-servlet的方法加载,服务器启动没错,jsp页面加载静态资源要 ...

  6. 对git的理解及常用指令

    以前总听说git[分布式版本控制系统]自己愣是搞不懂它到底要干哈-什么叫版本控制系统根本理解不了.现在工作需要必须要用到,结果好像就突然懂了git是干什么滴. 所以!原理这个东西的理解是要建立在大量的 ...

  7. Android Handler 最佳的理解资料

  8. c# 常量,变量

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  9. Xcode6 storyboard new push segue 后的视图控制器没有navigation item bug.

    手动切一下 老的push,再切回来,就会出有了,我想是一个bug. Xcode 6 Segue with UINavigationItem up vote0down votefavorite   I' ...

  10. jquery操作input值总结

    获取选中的值获取一组radio被选中项的值var item = $('input[@name=items][@checked]').val(); 获取select被选中项的文本var item = $ ...