PostPublish.bat命令行运行正常,作为发布后事件执行报错
发布后事件执行BitMono DLL混淆失败:控制台句柄无效问题解决
问题根源
发布后事件运行在非交互式控制台环境中,没有有效的控制台窗口句柄。而BitMono CLI内部调用了Console.Clear()方法,该方法在无控制台的环境下会触发IOException: The handle is invalid错误。直接通过命令提示符运行时属于交互式环境,控制台句柄有效,因此能正常执行。
解决方法
方案1:重定向输入,跳过交互等待
修改批处理中BitMono的调用行,将输入重定向到NUL,避免程序等待用户输入,同时规避控制台交互API的报错:
:: 替换原有的echo | 调用行 BitMono.CLI -f %ProjectDir%%PublishDir%%TargetFileName% -l %ProjectDir%%PublishDir% -o %ProjectDir%%PublishDir%%OutputFolder% < NUL
方案2:配置MSBuild以交互式控制台执行命令
修改CSProj中的Exec任务,添加参数强制在新控制台窗口执行批处理,确保BitMono能获取有效控制台句柄:
<Target Name="DllObfuscating" AfterTargets="Publish"> <Exec Command="D:\Obfuscation_Script\PostBuild.bat $(ProjectDir) $(PublishDir) $(TargetName) $(TargetExt) "D:\BitMono.CLI\" output\ _Original" UseShellExecute="true" CreateNoWindow="false" /> </Target>
方案3:在批处理中用start命令启动BitMono
在批处理的BitMono调用前添加start /wait,让程序在独立控制台窗口执行并等待完成:
:: 替换原有的echo | 调用行 start /wait BitMono.CLI -f %ProjectDir%%PublishDir%%TargetFileName% -l %ProjectDir%%PublishDir% -o %ProjectDir%%PublishDir%%OutputFolder%
额外注意事项
- 若
$(PublishDir)自带末尾斜杠,可在批处理中添加路径修剪逻辑避免拼接错误:set "PublishDir=%PublishDir:~0,-1%" - 确保带空格的路径参数都正确添加引号,避免批处理解析出错。
内容的提问来源于stack exchange,提问作者Sumit Rao
相关产品推荐
相关产品推荐

