码迷,mamicode.com
首页 > 其他好文 > 详细

一种调用dll的巧妙方法

时间:2018-11-14 14:10:36      阅读:90      评论:0      收藏:0      [点我收藏+]

标签:imp   tar   tco   rect   false   process   window   加载   RoCE   

直接上代码,后面说应用场景

新建一个项目,引入需要调用的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的巧妙方法

标签:imp   tar   tco   rect   false   process   window   加载   RoCE   

原文地址:https://www.cnblogs.com/HolyMeteor/p/9957287.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!