1. 程式人生 > >一種調用dll的巧妙方法

一種調用dll的巧妙方法

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的巧妙方法