一种调用dll的巧妙方法
直接上代码,后面说应用场景
新建一个项目,引入需要调用的dll,如下
class Program
{
[DllImport( "soft.dll" )]
static extern int CreditTrans( StringBuilder strin, StringBuilder strout );
static int Main( string[] args )
{
if( args== null || args.Length < 1 )
{
return -1;
} StringBuilder sb = new StringBuilder();
int result = CreditTrans( new StringBuilder( args[0] ), sb );
Console.WriteLine( sb.ToString() );
return result;
}
}
生成之后称之为辅助程序xxx.exe
调用方式辅助方法:
public static int ExecuteAppAndGetOutPut(string file_name, StringBuilder inputData, StringBuilder outputData )
{
FileInfo fi =new FileInfo(file_name);
// 创建一个进程信息
var info = new ProcessStartInfo
{
FileName = file_name,
Arguments = inputData.ToString(),
RedirectStandardOutput = true,
UseShellExecute = false,
WorkingDirectory =fi.DirectoryName,
// 不显示窗口
CreateNoWindow = true
}; // 启动进程
var p = Process.Start( info ); // 获取进程的输出
var result = p.StandardOutput.ReadToEnd().Replace( "\r\n", "" ).Replace( "\n", "" );
outputData.Append( result ); // 返回进程的退出码
return p.ExitCode;
}
调用方式如下:
ExecuteAppAndGetOutPut( "xxx.exe", inputData, outputData )
应用场景:
1.调用的dll内部有缓存,但是又没有提供清理的方法,或者dll本身不稳定,用dllimport加载调用后出现问题
2.C#用dllimport调用时无故抛异常,此时可以用纯C++或其他语言把xxx.exe重写
3.参见本博客另外一篇文章分离dll的巧妙方法
优势:
完全的代码分离,有点类似于web api,应用场景1时比domain方式不知道好用到哪里去了
劣势:
这种调用方式是另启进程,效率可想而知,但是某些时候及其好用
dll中有多个方法,且每个方法的数据必须和主程序有交互时,此方式不太好实现
非本人同意禁止转载,谢谢
一种调用dll的巧妙方法的更多相关文章
- 学习反射例子,调用DLL窗体及方法
创建类库,并添加新窗体,加入以下方法 public static string setText(string str) { return str; } 编译后把生成的DLL文件放入新项目的bin目录, ...
- 纯静态界面中(html)中通过js调用dll中的方法从数据库中读取数据
最近接到一个离职员工的任务,一个搭好框架的ERP系统,看了两天,说一下看到的东西,整个项目目录中我没发现一个.aspx后缀的文件,全是静态HTML文件,之后发现他用的jquery简直看的头疼,不过大概 ...
- C#调用Dll文件中方法的简单应用
参考:http://www.cnblogs.com/Asuphy/p/4206623.html 直接看代码,最简单的引入,只需要3步: using System; using System.Colle ...
- C#调用dll(Java方法)
因为工作需求,要求用C#直接调用Java方法,下面呢是操作过程以及一些理解,如果有什么理解不对的,欢迎大家指出! 具体操作: 一.将Java写好的Demo以jar包形式导出 package demo; ...
- C#反射动态调用dll中的方法
//加载程序集(dll文件地址),使用Assembly类 Assembly assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirec ...
- C#反射动态调用dll中的方法,并返回结果(转)
反射的作用是动态的加载某个dll(程序集),并执行该程序集中的某个方法,并返回结果:当然也可以给该方法传递参数 namespace assembly_name { public class assem ...
- C#反射动态调用dll中的方法及使用QuartZ.net实现作业调度
using Quartz; using Quartz.Impl; using System; using System.Collections.Generic; using System.Linq; ...
- http接口 两种调用http接口的方法
import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.NameValuePair; ...
- 一种把dll放在不同目录的巧妙方法
想必C#的开发者都遇到过这个问题,引用的dll都放在根目录下,随着项目的日益增大,根目录下充满了各种各样的dll,非常的不美观. 如果能够把dll按照想要的目录来存放,那么系统就美观多了,以下是我常用 ...
随机推荐
- 三叉神经树 ( neuron )
三叉神经树 ( neuron ) 题目描述 计算神经学作为新兴的交叉学科近些年来一直是学术界的热点.一种叫做SHOI 的神经组织因为其和近日发现的化合物SHTSC 的密切联系引起了人们的极大关注. S ...
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---41
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:
- python - break和continue
break 终止整个循环:当循环或判断执行到break语句时,即使判断条件为True或者序列尚未完全被历遍,都会跳出循环或判断 for i in xrange(10): print(i) if i = ...
- 转:C#制作ORM映射学习笔记二 配置类及Sql语句生成类
在正式开始实现ORM之前还有一点准备工作需要完成,第一是实现一个配置类,这个很简单的就是通过静态变量来保存数据库的一些连接信息,等同于.net项目中的web.config的功能:第二需要设计实现一个s ...
- hdu 1452(因子和+逆元)
Happy 2004 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- FZU 1056 扫雷游戏【搜索】
Accept: 2584 Submit: 6790Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description 扫雷是 ...
- [AHOI2005] SHUFFLE 洗牌
1965: [Ahoi2005]SHUFFLE 洗牌 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 952 Solved: 630[Submit][St ...
- 改变Linux的DNS解析顺序(DNS到hosts)
在Linux中,往往解析一个域名时,先会找/etc/hosts文件,如果/etc/hosts文件没有对应,才会去找DNS,那么有什么方式,让主机先找DNS呢? 当然有,在/etc/nsswitch.c ...
- Jenkins配置git进行构建失败:Error cloning remote repo 'origin'的解决思路
说明:这个没有实际的解决方法,只提供一个思路去解决. 操作系统:windows 背景:在配置的节点之后,由于是windows的系统,运行git克隆地址,使用的是SSH协议地址.出现如下的错误: Err ...
- ie8 不能加载dll的问题解决
请问是在打开IE的时候提示无法加载DLL文件吗? 请尝试重置IE: 1. 关闭所有Internet Explorer窗口. 2. 单击开始,点击运行,输入inetcpl.cpl,按回车. 3. 点击高 ...