1. 程式人生 > >一種呼叫dll的巧妙方法

一種呼叫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中有多個方法,且每個方法的資料必須和主程式有互動時,此方式不太好實現

 

非本人同意禁止轉載,謝謝