Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > как посмотреть что выводит на консоль dll


Автор: kh93b 23.6.2010, 12:45
есть библиотека написанная на C, вызываю метод из нее через pinvoke, как посмотреть что пишет библиотека в stdout\stderr ?
код вызова:
Код

[DllImport("mydll.dll", EntryPoint = "#1")]
private static extern IntPtr callmydll(string ConfigPath);
 static void Main(string[] args)
        {
IntPtr OOPtr = callmydll(@"C:\conf.xml");
            
}


вот так библиотека пишет логи
Код

fprintf(stderr, " --  reading config file \"%s\"...\n", filename);




Автор: jonie 24.6.2010, 00:32
kh93b, ну если у вас консоль, тогда она пишет стандартно собственно на косоль.
Иначе в файл например так:
Код

    class Program
    {
        [DllImport("../Debug/CSharpSTDERR.dll")]
        private static extern int fnCSharpSTDERR();

        [DllImport("Kernel32.dll", SetLastError = true)]
        public static extern int SetStdHandle(int device, IntPtr handle);


        static void Redirect()
        {
            int status;
            IntPtr handle;
            var filestream = new FileStream("logfile.txt", FileMode.Create);
            var streamwriter = new StreamWriter(filestream);
            streamwriter.AutoFlush = true;
            Console.SetOut(streamwriter);
            Console.SetError(streamwriter);

            handle = filestream.Handle;
            status = SetStdHandle(-11, handle); // set stdout
            // Check status as needed
            status = SetStdHandle(-12, handle); // set stderr
            // Check status as needed
        }

        static void Main(string[] args)
        {
            Redirect();

            fnCSharpSTDERR();
        }
    }

(с) http://stackoverflow.com/questions/1579074/redirect-stdoutstderr-on-c-windows-service
почитайте ссылку(!)

насчет -11 и -12 -- где-то мы на C++ форуме тоже такое делали (поищи) и там выясняли эти магические числа как раз ...но на память не вспомню.

Автор: kh93b 24.6.2010, 12:09
jonie, 
Цитата

kh93b, ну если у вас консоль, тогда она пишет стандартно собственно на косоль.



если консольный проект то да, пишет как надо, но у меня оконное приложение

Цитата

Иначе в файл например так:

попробовал пример, из C# весь вывод переводится, а вот то что DLL пишет не появляется (

попробовал сделать еще через

Код

[DllImport("kernel32.dll", EntryPoint = "AllocConsole", SetLastError = true,
    CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        private static extern int AllocConsole();

консоль появляется, из C# вывод идет,а из DLL также глухо (

Автор: jonie 25.6.2010, 09:09
kh93b, дамс, оказывается прикольно достаточно. std::cerr перенаправляется.
Ну тогда никто не мешает сделать
Код

freopen( "file.txt", "w", stderr ); 

....ну или посмотреть внутрь std::cerr как там сделан operator<<

Автор: Nickname 5.7.2010, 17:34
а если попробовать переименовать dll в exe?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)