直接上代码,后面说应用场景

新建一个项目,引入需要调用的dll,如下

  1. class Program
  2. {
  3. [DllImport( "soft.dll" )]
  4. static extern int CreditTrans( StringBuilder strin, StringBuilder strout );
  5. static int Main( string[] args )
  6. {
  7. if( args== null || args.Length < 1 )
  8. {
  9. return -1;
  10. }
  11.  
  12. StringBuilder sb = new StringBuilder();
  13. int result = CreditTrans( new StringBuilder( args[0] ), sb );
  14. Console.WriteLine( sb.ToString() );
  15. return result;
  16. }
  17. }

  生成之后称之为辅助程序xxx.exe

调用方式辅助方法:

  1. public static int ExecuteAppAndGetOutPut(string file_name, StringBuilder inputData, StringBuilder outputData )
  2. {
  3. FileInfo fi =new FileInfo(file_name);
  4. // 创建一个进程信息
  5. var info = new ProcessStartInfo
  6. {
  7. FileName = file_name,
  8. Arguments = inputData.ToString(),
  9. RedirectStandardOutput = true,
  10. UseShellExecute = false,
  11. WorkingDirectory =fi.DirectoryName,
  12. // 不显示窗口
  13. CreateNoWindow = true
  14. };
  15.  
  16. // 启动进程
  17. var p = Process.Start( info );
  18.  
  19. // 获取进程的输出
  20. var result = p.StandardOutput.ReadToEnd().Replace( "\r\n", "" ).Replace( "\n", "" );
  21. outputData.Append( result );
  22.  
  23. // 返回进程的退出码
  24. return p.ExitCode;
  25. }

  调用方式如下:

  1. ExecuteAppAndGetOutPut( "xxx.exe", inputData, outputData )

  应用场景:

1.调用的dll内部有缓存,但是又没有提供清理的方法,或者dll本身不稳定,用dllimport加载调用后出现问题

2.C#用dllimport调用时无故抛异常,此时可以用纯C++或其他语言把xxx.exe重写

3.参见本博客另外一篇文章分离dll的巧妙方法

优势:

完全的代码分离,有点类似于web api,应用场景1时比domain方式不知道好用到哪里去了

劣势:

这种调用方式是另启进程,效率可想而知,但是某些时候及其好用

dll中有多个方法,且每个方法的数据必须和主程序有交互时,此方式不太好实现

非本人同意禁止转载,谢谢

一种调用dll的巧妙方法的更多相关文章

  1. 学习反射例子,调用DLL窗体及方法

    创建类库,并添加新窗体,加入以下方法 public static string setText(string str) { return str; } 编译后把生成的DLL文件放入新项目的bin目录, ...

  2. 纯静态界面中(html)中通过js调用dll中的方法从数据库中读取数据

    最近接到一个离职员工的任务,一个搭好框架的ERP系统,看了两天,说一下看到的东西,整个项目目录中我没发现一个.aspx后缀的文件,全是静态HTML文件,之后发现他用的jquery简直看的头疼,不过大概 ...

  3. C#调用Dll文件中方法的简单应用

    参考:http://www.cnblogs.com/Asuphy/p/4206623.html 直接看代码,最简单的引入,只需要3步: using System; using System.Colle ...

  4. C#调用dll(Java方法)

    因为工作需求,要求用C#直接调用Java方法,下面呢是操作过程以及一些理解,如果有什么理解不对的,欢迎大家指出! 具体操作: 一.将Java写好的Demo以jar包形式导出 package demo; ...

  5. C#反射动态调用dll中的方法

    //加载程序集(dll文件地址),使用Assembly类 Assembly assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirec ...

  6. C#反射动态调用dll中的方法,并返回结果(转)

    反射的作用是动态的加载某个dll(程序集),并执行该程序集中的某个方法,并返回结果:当然也可以给该方法传递参数 namespace assembly_name { public class assem ...

  7. C#反射动态调用dll中的方法及使用QuartZ.net实现作业调度

    using Quartz; using Quartz.Impl; using System; using System.Collections.Generic; using System.Linq; ...

  8. http接口 两种调用http接口的方法

    import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.NameValuePair; ...

  9. 一种把dll放在不同目录的巧妙方法

    想必C#的开发者都遇到过这个问题,引用的dll都放在根目录下,随着项目的日益增大,根目录下充满了各种各样的dll,非常的不美观. 如果能够把dll按照想要的目录来存放,那么系统就美观多了,以下是我常用 ...

随机推荐

  1. Flask deployment on gunicorn with flask script

    https://stackoverflow.com/questions/34265870/flask-deployment-on-gunicorn-with-flask-script 依赖 Flask ...

  2. python(7)-- 文件I/O

    1 打印到屏幕:print 语句.你可以给它传递零个或多个用逗号隔开的表达式.此函数把你传递的表达式转换成一个字符串表达式,并将结果写到标准输出,eg:print "Python 是一个非常 ...

  3. mongoDB最新版安装

    转载自:http://www.higis.org/2012/04/25/ubuntu-install-mongodb/ ubuntu上安装mongodb本可以直接通过sudo apt-get inst ...

  4. 怎样在SQL2005中设置 自增长类型?

    原文发布时间为:2009-04-25 -- 来源于本人的百度文章 [由搬家工具导入] 最近好几个人问我。。。。。 企业管理器-->右键你的表-->设计表-->选中一int类型字段-- ...

  5. error LNK2001: unresolved external symbol __imp__WSAStartup@8 SOCKET(转)

    VC6.0下的错误信息: error LNK2001: unresolved external symbol __imp__socket@12 error LNK2001: unresolved ex ...

  6. i2c 协议解析【转】

    转自:http://blog.csdn.net/g_salamander/article/details/8016698 版权声明:本文为博主原创文章,未经博主允许不得转载. 1.基本概念 主机    ...

  7. hdu 3986(最短路变形好题)

    Harry Potter and the Final Battle Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65536/6553 ...

  8. (21)Oracle表查询进阶

    转到基本查询 一.多表查询 笛卡尔积:每张表的列数相加,行数相乘. 连接条件:得出笛卡尔积后需要用where条件筛选出正确的数据.连接条件至少需要n张表减1个 1.等值连接 连接条件为等号 selec ...

  9. HDU 6249 Alice’s Stamps(2017 CCPC-Final G题,DP)

    题目链接 HDU 6249 题意 给定$m$个区间,在这些区间中选出不超过$k$个,求被覆盖的点的数量的最大值. 设$f[i][j]$表示选到第$i$个点并选了$j$个区间的时候能得到的最大答案. 处 ...

  10. [TJOI2014] 上升子序列

    刚刚做的时候一看:这不是个傻逼题吗hhhhh....然后发现写完了过不了样例,仔细一看题:同构的算一种. 这可咋办啊? 其实很简单,设f[i] 为 以a[i] 结尾的上升子序列个数,我们考虑当前如果算 ...