从导入的DLL中抑制控制台打印

时间:2013-10-11 17:02:58

标签: c# c++ console dllimport

在C#控制台应用程序中,我导入了本机C ++ DLL方法。例如:

    [DllImport("MyDll.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
    public static extern int MyMethod(IntPtr somePointer);

执行时,MyMethod()正在打印输出到控制台,我想隐藏它。

假设我无法更改DLL,我怎么能抑制它的输出?

2 个答案:

答案 0 :(得分:1)

您希望这样做的唯一方法是在调用DLL时重定向标准输出。我从来没有尝试过,也不知道它是否有效。

使用SetStdHandle将标准输出定向到其他地方。例如,nul设备的句柄可以。如果在调用DLL返回后需要恢复原始标准输出句柄,则需要再次调用SetStdHandle

你需要为每次调用DLL跳过这些箍。如果你有线程和/或回调,事情会变得更加复杂。

答案 1 :(得分:1)

http://social.msdn.microsoft.com/Forums/vstudio/en-US/31a93b8b-3289-4a7e-9acc-71554ab8fca4/net-gui-application-native-library-console-stdout-redirection-via-anonymous-pipes修改

我删除了他们尝试重定向的部分,因为如果您进一步阅读,则表示在多次调用时它们会出现问题。

 public static class ConsoleOutRedirector
    {
    #region Constants

    private const Int32 STD_OUTPUT_HANDLE = -11;

    #endregion

    #region Externals

    [DllImport("Kernel32.dll")]
    extern static Boolean SetStdHandle(Int32 nStdHandle, SafeHandleZeroOrMinusOneIsInvalid handle);
    [DllImport("Kernel32.dll")]
    extern static SafeFileHandle GetStdHandle(Int32 nStdHandle);

    #endregion

    #region Methods

    public static void GetOutput(Action action)
    {
      Debug.Assert(action != null);

      using (var server = new AnonymousPipeServerStream(PipeDirection.Out))
      {
        var defaultHandle = GetStdHandle(STD_OUTPUT_HANDLE);

        Debug.Assert(!defaultHandle.IsInvalid);
        Debug.Assert(SetStdHandle(STD_OUTPUT_HANDLE, server.SafePipeHandle));
        try
        {
          action();
        }
        finally
        {
          Debug.Assert(SetStdHandle(STD_OUTPUT_HANDLE, defaultHandle));
        }
      }
    }

    #endregion
  }

和使用示例:

[DllImport("SampleLibrary.dll")]
extern static void LetterList();

private void button1_Click(object sender, EventArgs e)
{
  ConsoleOutRedirector.GetOutput(() => LetterList());
}