powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Логирование в C# ехе приложении из C++ дллки
14 сообщений из 14, страница 1 из 1
Логирование в C# ехе приложении из C++ дллки
    #39473725
bnetrealm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую.
Сразу оговорюсь - я новичок, и возможно задам глупый вопрос, но прошу отнестись с пониманием :)
В общем, пишу в целях изучения C# и С++ - торрент клиент (ехе, на C#), который будет использовать dll (на С++) которая будет являться враппером над libtorrent (которая тоже на С++).
У меня написан класс для логгирования в ехешнике. В моей дллке-враппере мне тоже потребуется логирование, и мне бы не хотелось выделять это логирование в отдельный файл, ибо в результате у меня будет два лог файла, и у каждого соответственно своя последовательность сообщений, а мне бы хотелось иметь единую последовательность сообщений в рамках единого лог файла.
Поэтому, вопрос: можно ли как-то пробросить из ехешника в дллку [ссылку? указатель? ..?] на уже созданный и работающий логгер, а в самой дллке использовать эту ссылку/указатель/что-то ещё? И обращаясь к ней в дллке (аля Log(L"bla bla")), вызов/данные уходил бы в C#-овый ехешник в тамошний логгер и соответственно логируемое сообщение попадало бы в [единый] лог файл.
Возможно ли такое сделать? Если да, можно ли увидеть пример?

Заранее благодарю.
...
Рейтинг: 0 / 0
Логирование в C# ехе приложении из C++ дллки
    #39473744
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я сначала хотел сказать, что вызывать управляемый код из нативного невозможно, но задав верный вопрос - есть обходные пути

См.2й ответ где список
https://stackoverflow.com/questions/778590/calling-c-sharp-code-from-c/778677#778677
...
Рейтинг: 0 / 0
Логирование в C# ехе приложении из C++ дллки
    #39473745
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglЯ сначала хотел сказать, что вызывать управляемый код из нативного невозможно, но задав верный вопрос - есть обходные пути

См.2й ответ где список
https://stackoverflow.com/questions/778590/calling-c-sharp-code-from-c/778677#778677

или 5-й
...
Рейтинг: 0 / 0
Логирование в C# ехе приложении из C++ дллки
    #39473746
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но вместо занятия нетривиальным хм....

Лучше вынести логирование на уровень выше - в основную программу.

Вызывать нативный код DLL из c# попроще, чем наоборот.
...
Рейтинг: 0 / 0
Логирование в C# ехе приложении из C++ дллки
    #39473784
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bnetrealmПоэтому, вопрос: можно ли как-то пробросить из ехешника в дллку [ссылку? указатель? ..?] на уже созданный и работающий логгер, а в самой дллке использовать эту ссылку/указатель/что-то ещё? И обращаясь к ней в дллке (аля Log(L"bla bla")), вызов/данные уходил бы в C#-овый ехешник в тамошний логгер и соответственно логируемое сообщение попадало бы в [единый] лог файл.
Возможно ли такое сделать?
да
делегат в качестве callback для неуправляемого кода - не требует особых усилий

https://msdn.microsoft.com/ru-ru/library/5zwkzwf4(v=vs.110).aspx

внимательно примечание читать
авторПри использовании делегата в вызове, среда CLR защищает делегат от процесса сбора мусора на протяжении всего вызова. Но если неуправляемая функция сохраняет делегат для использования после завершения вызова, необходимо предотвратить сборку мусора вручную до тех пор, пока неуправляемая функция не закончит работу с делегатом
перевод кривой - смысл в защите конкретного экземпляра делегата от мусоросборщика
...
Рейтинг: 0 / 0
Логирование в C# ехе приложении из C++ дллки
    #39473814
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bnetrealm,

враппер написать на C++/CLI. При этом можно и нативную dll свободно использовать и с C# легко взаимодействовать.
...
Рейтинг: 0 / 0
Логирование в C# ехе приложении из C++ дллки
    #39473818
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если простого коллбэка недостаточно - можно COM интерфейс использовать

ЗЫ как-то странно начинать изучение C# и С++ с интеропа
...
Рейтинг: 0 / 0
Логирование в C# ехе приложении из C++ дллки
    #39473879
bnetrealm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я сначала хотел сказать, что вызывать управляемый код из нативного невозможно, но задав верный вопрос - есть обходные пути
К сожалению, ничего не помогло. По сути, все советы сводятся к:
а) Компилим С++-ную дллку как CLR (что мне не вариант, т.к. libtorrent тогда приходится компилить тоже как дллку (и тянуть за собой дллки boost'a), не получается её как либу запихнуть, а это в свою очередь тянет кучу других длл за собой, а мне бы хотелось чтобы у меня по минимому было внешних файлов)
б) Делаем промежуточную C++/CLI дллку между чисто С++-ной дллкой, и чисто C#-повым приложением (такой расклад требуется в том числе если хочется идти COM-путем)

Пожалуй единственный возможный - это делать pipe между ехешником и дллкой, но меня это решение немного смущает потенциальными задержками... по сути микро сервачок, а значит выносить его в отдельный low-prio поток, чтобы влиял по минимому (ведь по сути единственное его назначение - передавать лог-сообщение в ехешник, чтобы в свою очередь тот вывел это в лог файл), чесать репу что делать если пайпа вдруг не создасться и я (или пользователь допустим моего торрент клиента) останется без лога (и я не смогу узнать почему у него что-то не работает...), в общем, как-то не знаю, думается что я просто чего-то не замечаю по неопытности, и есть выход куда проще... путем делегатов может каких-нить как советовал выше Изопропил, вот тока его пример на сайте Microsoft что он скинул - там показано как передавать сообщения из ехешника в дллку, а мне то надо наоборот и как это сделать там это не показано :-\

Неужели таки нет простой возможности пообщаться с C#-опвым ехешником из чистой С++ (без /clr!) дллки? :-\
Либо я криво прочитал и всё неправильно понял? :-\

ЗЫ как-то странно начинать изучение C# и С++ с интеропа
Ну, я скорее исхожу из того, что программирование изучается эффективнее всего, когда ты пытаешься написать то, что тебе написать элементарно интересно. Ну а это в свою очередь ведёт к тому, что на пути могут встречаться разные проблемы, к решению которых ты в том числе можешь быть не готов. Поэтому и обращаюсь за помощью к матёрым знатокам тут на форуме )))
...
Рейтинг: 0 / 0
Логирование в C# ехе приложении из C++ дллки
    #39473936
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bnetrealmа мне бы хотелось чтобы у меня по минимому было внешних файлов)
на это не стоит обращать внимание

bnetrealmMicrosoft что он скинул - там показано как передавать сообщения из ехешника в дллку, а мне то надо наоборот и как это сделать там это не показано :-\
читайте внимательно - не сообщения передаются, а функция, которая может быть вызвана из c/c++ dll
сообщение будет получено в c# коде

bnetrealmНеужели таки нет простой возможности пообщаться с C#-опвым ехешником из чистой С++ (без /clr!) дллки? :-\
конечно есть ( более того с++./clr - зачастую не решает, а просто отодвигает проблему)

давайте уточним, что имеется ввиду под "пообщаться" ?
в коде враппера вызвать функцию c# ? - я собственно этот пример и приводил
...
Рейтинг: 0 / 0
Логирование в C# ехе приложении из C++ дллки
    #39473985
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bnetrealm,

так понятнее?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
typedef    void(__stdcall *CB)(char *);
static CB _logMsg;

void logMsg(char * msg) {
	if(_logMsg) _logMsg(msg);
}

extern "C" __declspec(dllexport)  void   __stdcall setCallback(CB cb) {
	_logMsg = cb;
}
extern "C" __declspec(dllexport) void    __stdcall something() {
	logMsg("Hello");
}


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
using System;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    class Program
    {
        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate void CB([MarshalAs(UnmanagedType.LPStr)]string msg);
        [DllImport(@"D:\VC\ConsoleApplication1\Debug\Win32Project1.dll", CallingConvention = CallingConvention.StdCall)]
        static extern  void something();
        [DllImport(@"D:\VC\ConsoleApplication1\Debug\Win32Project1.dll", CallingConvention = CallingConvention.StdCall)]
        static extern void setCallback(IntPtr cb);
      
        static GCHandle hcb;

        static void logMsg(string msg)
        {
            Console.WriteLine("LOG: {0}", msg);
        }

        static void Main(string[] args)
        {
            CB cb = new CB(logMsg);
            hcb = GCHandle.Alloc(cb);
            setCallback(Marshal.GetFunctionPointerForDelegate(cb));

            something();
            logMsg("world");
            hcb.Free();
        }
    }
}
...
Рейтинг: 0 / 0
Логирование в C# ехе приложении из C++ дллки
    #39474468
bnetrealm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил,

Да, именно то что нужно! Спасибо)) Может у вас есть qiwi? Отблагодарить хоть немножко, за то что наглядно разжевали с примером :)
...
Рейтинг: 0 / 0
Логирование в C# ехе приложении из C++ дллки
    #39474477
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bnetrealm,

достаточно доброго слова ))
...
Рейтинг: 0 / 0
Логирование в C# ехе приложении из C++ дллки
    #39474504
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

Тогда номер кошелька добрых слов ;)
...
Рейтинг: 0 / 0
Логирование в C# ехе приложении из C++ дллки
    #39474985
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bnetrealmИзопропил,

Да, именно то что нужно! Спасибо)) Может у вас есть qiwi? Отблагодарить хоть немножко, за то что наглядно разжевали с примером :)

Вы хотите с него еще и денег стрясти ?
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Логирование в C# ехе приложении из C++ дллки
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]