Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
VDev, я Вас умоляю... :) Я все так и сделал уже давно. За исключением того, что удалил фаил с DllMain - она не нужна, в DllMain нельзя вызывать управляемый код. И отключил в проекте Entry Point. А все эти дефайны есть в stdafx.h. И все отлично работает.
Проблема в том, что я не хочу писать на С++. Поэтому на С++ у меня только вызовы C# кода. А значит два проекта в одном солюшине. Просто в С++ проекте стоит референс на C# проект, а в С++ коде тупо вызов (обернутый в try catch) статических методов С#. Вот и вся интеграция:)
Но дело в том, что эти два проекта компилируются в две разных dll. И dll C# грузится только из папки МТ. А dll C++ грузится откуда надо (из папки \experts\libraries\ в том числе). Это конечно не великое горе, но раздражает. Вот я и хочу их скомпилить в одну DLL. Вы знаете как это сделать? :)
Или нужно как то задать, что бы С++ грузил NET библиотеку не из корня исполняемого приложения (МТ в данном случае), а из подпапки (относительным путем обязательно).
Повторюсь, это не страшная проблема, но все же.
Попробуйте объединить через AL.exe. хотя думаю врятле что-то выйдет.
еще можете в конфиге прописать где вашу библиотеку искать. но опять же появится еще файл .config
VDev, я Вас умоляю... :) Я все так и сделал уже давно. За исключением того, что удалил фаил с DllMain - она не нужна, в DllMain нельзя вызывать управляемый код. И отключил в проекте Entry Point. А все эти дефайны есть в stdafx.h. И все отлично работает.
Проблема в том, что я не хочу писать на С++. Поэтому на С++ у меня только вызовы C# кода. А значит два проекта в одном солюшине. Просто в С++ проекте стоит референс на C# проект, а в С++ коде тупо вызов (обернутый в try catch) статических методов С#. Вот и вся интеграция:)
Но дело в том, что эти два проекта компилируются в две разных dll. И dll C# грузится только из папки МТ. А dll C++ грузится откуда надо (из папки \experts\libraries\ в том числе). Это конечно не великое горе, но раздражает. Вот я и хочу их скомпилить в одну DLL. Вы знаете как это сделать? :)
Или нужно как то задать, что бы С++ грузил NET библиотеку не из корня исполняемого приложения (МТ в данном случае), а из подпапки (относительным путем обязательно).
Повторюсь, это не страшная проблема, но все же.
Не надо умолять, лучше пишите подробнее о проблеме, а то не ясно было :) Я сильно сомневаюсь, что можно в одной dll скрестить С++ и С#, не используя хаков.
Вот я и хочу их скомпилить в одну DLL. Вы знаете как это сделать? :)
Нивапрос. Те же яйца. Делаете Net дллку либкой и ставите C++ дллку в зависимость от либки.
Используемый из либы в дллке код будет в дллке.
кстати на вход функции вместо MQL_string подаю обычный char* и все работает.
Есть нескольно но:
Строку переданную как char* можно использовать только как параметр "по значению". Изменение области памяти на котурую ссылается указатель ни к чему не приводит. Впрочем, можно использовать этот же указатель как результат функции - тогда можно будет вернуть измененую строку. Кроме еще одного но: в dll нельзя узнать размер выделенного буфера на начало которого указывается этот char*. И в MQL этого тоже узнать нельзя. Т.е. это не безопасно. Выделять в dll память и возвращать на нее указатель => memory leak.
Так, что, имхо, если нужно изменить строку - то только MQLString.
Я так понимаю.
Строку переданную как char* можно использовать только как параметр "по значению".
согласен, char* пытался крутить как ссылочный - не вышло =).
вообще думаю, если время есть, то можно написать статью. Периодичести здесь появляются темы про связки .NET dll и mql.
еще хорошо бы было составить таблицу соответствий типов (mql <-> c++/cli <-> c#) + преобразования туда-обратно