在C#控制台应用程序中,我导入了本机C ++ DLL方法。例如:
[DllImport("MyDll.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
public static extern int MyMethod(IntPtr somePointer);
执行时,MyMethod()
正在打印输出到控制台,我想隐藏它。
假设我无法更改DLL,我怎么能抑制它的输出?
答案 0 :(得分:1)
您希望这样做的唯一方法是在调用DLL时重定向标准输出。我从来没有尝试过,也不知道它是否有效。
使用SetStdHandle
将标准输出定向到其他地方。例如,nul设备的句柄可以。如果在调用DLL返回后需要恢复原始标准输出句柄,则需要再次调用SetStdHandle
。
你需要为每次调用DLL跳过这些箍。如果你有线程和/或回调,事情会变得更加复杂。
答案 1 :(得分:1)
我删除了他们尝试重定向的部分,因为如果您进一步阅读,则表示在多次调用时它们会出现问题。
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());
}