一种调用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中有多个方法,且每个方法的数据必须和主程序有交互时,此方式不太好实现
非本人同意禁止转载,谢谢