一種呼叫dll的巧妙方法
阿新 • • 發佈:2018-11-14
直接上程式碼,後面說應用場景
新建一個專案,引入需要呼叫的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中有多個方法,且每個方法的資料必須和主程式有互動時,此方式不太好實現
非本人同意禁止轉載,謝謝