一种调用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按照想要的目录来存放,那么系统就美观多了,以下是我常用 ...
随机推荐
- 共鸣(resonance)
共鸣(resonance) 题目描述 GHQ通过在24区引起基因组共鸣,从而引发了第二次失落的圣诞. 24区的地图可以视为一个二维平面.GHQ在24区布置了m架发射塔,而葬仪社也建立了n个据点.要阻止 ...
- Python实现knn
#coding:utf-8 import numpy as np import operator import os def classify0(inX, dataSet, labels, k): d ...
- css 三列布局
前面的话 前面已经介绍过单列定宽单列自适应和两列自适应的两列布局.本文介绍三列布局,分为两侧定宽中间自适应.两列定宽一侧自适应.中间定宽两侧自适应.一侧定宽两列自适应和三列自适应这五种情况 两侧定宽中 ...
- HDU [P3849]
tarjan 求 无向图的割边 (桥) 边 (x,y) 是桥当且仅当, 对于 x 的子节点 y ,low[x] < dfn[y] 对于连向父节点的边要特殊处理 #include <iost ...
- win10易升卸载
- Shell中的单引号(‘)双引号(”)和反引号(·)
在bash中,$.*.?.[.].’.”.`.\.有特殊的含义.类似于编译器的预编译过程,bash在扫描命令行的过程中,会在文本层次上,优先解释所有的特殊字符,之后对转换完成的新命令行,进行内核的系统 ...
- 《Linux内核Makefile分析》之 auto.conf, auto.conf.cmd, autoconf.h【转】
转自:http://blog.sina.com.cn/s/blog_87c063060101l25y.html 转载:http://blog.csdn.net/lcw_202/article/deta ...
- PHP安装oracle的php_oci和oci8扩展
环境:centos6.9 php5.3.3 oracle客户端:下载链接:http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277 ...
- mysql error 1093 解决办法
mysql> select * from t; +----+ | id | +----+ | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 ...
- AC日记——[HAOI2007]理想的正方形 P2216
[HAOI2007] 理想的正方形 思路: 正解多个单调队列: 但是我用树套树水了过去: 来,上代码: #include <cstdio> #include <cstring> ...