Связка MQL4 + .Net - страница 6

 

VDev, я Вас умоляю... :) Я все так и сделал уже давно. За исключением того, что удалил фаил с DllMain - она не нужна, в DllMain нельзя вызывать управляемый код. И отключил в проекте Entry Point. А все эти дефайны есть в stdafx.h. И все отлично работает.

Проблема в том, что я не хочу писать на С++. Поэтому на С++ у меня только вызовы C# кода. А значит два проекта в одном солюшине. Просто в С++ проекте стоит референс на C# проект, а в С++ коде тупо вызов (обернутый в try catch) статических методов С#. Вот и вся интеграция:)

Но дело в том, что эти два проекта компилируются в две разных dll. И dll C# грузится только из папки МТ. А dll C++ грузится откуда надо (из папки \experts\libraries\ в том числе). Это конечно не великое горе, но раздражает. Вот я и хочу их скомпилить в одну DLL. Вы знаете как это сделать? :)

Или нужно как то задать, что бы С++ грузил NET библиотеку не из корня исполняемого приложения (МТ в данном случае), а из подпапки (относительным путем обязательно).

Повторюсь, это не страшная проблема, но все же.

 

Попробуйте объединить через AL.exe. хотя думаю врятле что-то выйдет.

еще можете в конфиге прописать где вашу библиотеку искать. но опять же появится еще файл .config

 
MuruFigi >>:

VDev, я Вас умоляю... :) Я все так и сделал уже давно. За исключением того, что удалил фаил с DllMain - она не нужна, в DllMain нельзя вызывать управляемый код. И отключил в проекте Entry Point. А все эти дефайны есть в stdafx.h. И все отлично работает.

Проблема в том, что я не хочу писать на С++. Поэтому на С++ у меня только вызовы C# кода. А значит два проекта в одном солюшине. Просто в С++ проекте стоит референс на C# проект, а в С++ коде тупо вызов (обернутый в try catch) статических методов С#. Вот и вся интеграция:)

Но дело в том, что эти два проекта компилируются в две разных dll. И dll C# грузится только из папки МТ. А dll C++ грузится откуда надо (из папки \experts\libraries\ в том числе). Это конечно не великое горе, но раздражает. Вот я и хочу их скомпилить в одну DLL. Вы знаете как это сделать? :)

Или нужно как то задать, что бы С++ грузил NET библиотеку не из корня исполняемого приложения (МТ в данном случае), а из подпапки (относительным путем обязательно).

Повторюсь, это не страшная проблема, но все же.

Не надо умолять, лучше пишите подробнее о проблеме, а то не ясно было :) Я сильно сомневаюсь, что можно в одной dll скрестить С++ и С#, не используя хаков.

 
MuruFigi >>:

Вот я и хочу их скомпилить в одну DLL. Вы знаете как это сделать? :)

Нивапрос. Те же яйца. Делаете Net дллку либкой и ставите C++ дллку в зависимость от либки.

Используемый из либы в дллке код будет в дллке.

 
Рабочий примерчик. Может кому интересно будет. Может имеет смысл статью накатать?
Файлы:
netsampler.zip  15 kb
 
кстати на вход функции вместо MQL_string подаю обычный char* и все работает.
 
GarF1eld писал(а) >>
кстати на вход функции вместо MQL_string подаю обычный char* и все работает.

Есть нескольно но:

Строку переданную как char* можно использовать только как параметр "по значению". Изменение области памяти на котурую ссылается указатель ни к чему не приводит. Впрочем, можно использовать этот же указатель как результат функции - тогда можно будет вернуть измененую строку. Кроме еще одного но: в dll нельзя узнать размер выделенного буфера на начало которого указывается этот char*. И в MQL этого тоже узнать нельзя. Т.е. это не безопасно. Выделять в dll память и возвращать на нее указатель => memory leak.

Так, что, имхо, если нужно изменить строку - то только MQLString.

Я так понимаю.

 
MuruFigi >>:

Строку переданную как char* можно использовать только как параметр "по значению".

согласен, char* пытался крутить как ссылочный - не вышло =).

вообще думаю, если время есть, то можно написать статью. Периодичести здесь появляются темы про связки .NET dll и mql.

еще хорошо бы было составить таблицу соответствий типов (mql <-> c++/cli <-> c#) + преобразования туда-обратно

Причина обращения: