Это плохой пример использования библиотеки C-Runtime Library для вызова put. Продолжайте читать учебник, поскольку там есть хорошая информация, но вместо этого попробуйте выполнить вызовы Win32 API.
Вот лучшее введение в p / invoke: http://msdn.microsoft.com/en-us/magazine/cc164123.aspx
Он старый, но информация все еще хорошая.
Отредактированный
Мое объяснение было неверным.
Я искал правильное объяснение и обнаружил, что метод C-Runtime put и метод .NET Framework Console.Write различаются по способу записи в консоль (Console.Write работает там, где выполняется p / invoke для put не). Я подумал, что, возможно, ответ был там, поэтому я поднял эту демонстрацию:
using System;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
class Program
{
public static void Main()
{
int written;
string outputString = "Hello, World!\r\n";
byte[] outputBytes = Encoding.Default.GetBytes(outputString);
//
// This is the way the C-Runtime Library method puts does it
IntPtr conOutHandle = CreateFile("CONOUT$", 0x40000000, FileShare.ReadWrite, IntPtr.Zero, FileMode.Open, 0, IntPtr.Zero);
WriteConsole(conOutHandle, outputBytes, outputString.Length, out written, IntPtr.Zero);
//
// This is the way Console.Write does it
IntPtr stdOutputHandle = GetStdHandle(STD_OUTPUT_HANDLE);
WriteFile(stdOutputHandle, outputBytes, outputBytes.Length, out written, IntPtr.Zero);
// Pause if running under debugger
if (Debugger.IsAttached)
{
Console.Write("Press any key to continue . . . ");
Console.ReadKey();
}
}
const int STD_OUTPUT_HANDLE = -11;
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr GetStdHandle(int nStdHandle);
[DllImport("kernel32.dll", SetLastError = true)]
static extern int WriteFile(IntPtr handle, [In] byte[] bytes, int numBytesToWrite, out int numBytesWritten, IntPtr mustBeZero);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern IntPtr CreateFile(string lpFileName, int dwDesiredAccess, FileShare dwShareMode, IntPtr securityAttrs, FileMode dwCreationDisposition, int dwFlagsAndAttributes, IntPtr hTemplateFile);
[DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true)]
static extern bool WriteConsole(IntPtr hConsoleOutput, [In] byte[] lpBuffer, int nNumberOfCharsToWrite, out int lpNumberOfCharsWritten, IntPtr mustBeZero);
}
Оба из них успешно выводятся под отладчиком, даже с включенным процессом хостинга. Так что это тупик.
Я хотел бы поделиться этим на случай, если это заставит кого-то еще выяснить почему это происходит - Ганс?