一種調用dll的巧妙方法
阿新 • • 發佈:2018-11-14
api repl console 內部 分離 dllimport string 轉載 數據
直接上代碼,後面說應用場景
新建一個項目,引入需要調用的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的巧妙方法