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

 

非本人同意禁止转载,谢谢

posted @ 2018-11-14 12:11  twtyypmb  阅读(645)  评论(0编辑  收藏  举报