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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

давайте уточним, что имеется ввиду под "пообщаться" ?
в коде враппера вызвать функцию c# ? - я собственно этот пример и приводил
...
Рейтинг: 0 / 0
19.06.2017, 10:44
    #39473985
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Логирование в C# ехе приложении из C++ дллки
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
19.06.2017, 21:50
    #39474468
bnetrealm
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Логирование в C# ехе приложении из C++ дллки
Изопропил,

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

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

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

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

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


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