一种调用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按照想要的目录来存放,那么系统就美观多了,以下是我常用 ...
随机推荐
- 个人环境搭建——版本控制SVN
版本控制SVN SVN服务器配置: 第一部分:svn服务器搭建(主要是四步走) 参考:http://www.son1c.cn/show/920.html 一,安装Subversion sudo apt ...
- VIJOS【1234】口袋的天空
背景 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 描述 给你云朵的个数N,再给你M个关系,表示哪些云朵可以连在一起. ...
- 控制台或Winform程序中如何编码或解码Server.URLEncode
原文发布时间为:2010-07-10 -- 来源于本人的百度文章 [由搬家工具导入] 在Asp.net中可以使用Server.HTMLEncode和Server.URLEncode 将文本或URL的特 ...
- 记忆泛型约束where
原文发布时间为:2011-03-29 -- 来源于本人的百度文章 [由搬家工具导入] http://msdn.microsoft.com/en-us/library/d5x73970.aspx
- Python Challenge 第十四关
14关页面上是两张图,一张是一个卷面包,一张类似条形码的东西.没任何提示,就看源代码,果然,有一行注释: <!-- remember: 100*100 = (100+99+99+98) + (. ...
- Nowcoder Girl 参考题解【待写】
[官方题解]:https://www.nowcoder.com/discuss/65411?toCommentId=1134823 [题目链接]:https://www.nowcoder.com/te ...
- Cat Snuke and a Voyage --AtCoder
题目描述 In Takahashi Kingdom, there is an archipelago of N islands, called Takahashi Islands. For conve ...
- SQLite FTS5使用小技巧
SQLite FTS5使用小技巧 在SQLite中,全文索引功能以扩展模块存在.使用全文索引,可以快速对大段文字进行搜索.SQLite提供FTS3.FTS4.FTS5三个模块.其中,FTS5是最新 ...
- 修改密码删除登陆态,那其他正在登陆的app怎么办?
修改密码删除登陆态,那其他正在登陆的app怎么办?
- Zend Studio 9.0.2破解文件和注册码下载
Zend Studio是Zend Technologies开发的PHP语言集成开发环境(IDE),是公认最好的PHP开发工具.当前Zend Studio最新版本是9.0.2. Zend Studio ...