Вызов/сортировка строк из С# dll в неуправляемый код

Я пытаюсь вызвать функцию С# в dll из неуправляемого стороннего приложения - metatrader

Я последовал совету из раздела Вызов C# dll из неуправляемого кода, однако пример с сортировкой строк не работает.

Примечание. Я успешно вызвал пример целочисленного сложения из справочника (функция «Добавить»), и он работает от начала до конца без проблем, поэтому я знаю, что проблема связана со строками. Т.е. функция "ReplaceString" не работает. Я также просмотрел веб-сайт RobertGisiecke, но там нет примера строки, или я слишком туп, чтобы понять это.

Сообщение об ошибке, которое я получаю в метатрейдере:

15:27:40 10.11.2009, 00:01 MT4LibTest EURUSD,H1: вызов функции 'ReplaceString' из dll 'Testme.dll' критическая ошибка c0000005 at 040B031B.

Платформа — Windows Server 2012 (64-битная), и я скомпилировал ее для x86, потому что Metatrader — это программа для x86.

Еще одна вещь: я не очень опытен в мире VS, поэтому я надеюсь, что кто-то может быть достаточно любезен, чтобы помочь

Спасибо

Код С#:

[DllExport("ReplaceString", CallingConvention = CallingConvention.StdCall)]
    public static int ReplaceString(
        [In, Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder str,
        [MarshalAs(UnmanagedType.LPWStr)]string a, 
        [MarshalAs(UnmanagedType.LPWStr)]string b)
    {
        str.Replace(a, b);

        if (str.ToString().Contains(a)) return 1;
        else 
            return 0;
    }

Функция вызова (Metatrader):

#import "MT4Lib.dll"
    int ReplaceString(string & str,string a,string b);
    int Add(int x, int y);
#import
    string str="A quick brown fox jumps over the lazy dog";
    string stra = "fox";
    string strb = "cat";        

    Print(str);
    Print(ReplaceString(str,stra,strb));
    Print(str);

РЕДАКТИРОВАТЬ: я должен четко указать, что API метатрейдера, который позволяет писать «скрипты», не допускает полных типов С++. Так что нет ни char, ни wchar, ни тем более указателей на эти типы. Только "строка".


person Harrison Stacked    schedule 29.12.2012    source источник
comment
Добро пожаловать в StackOverflow. Вы не можете передать строку C++ в приложение C#. Вам, вероятно, потребуется сделать его wchar *. Также смотрите соответствующие вопросы (справа). Например: stackoverflow .com/questions/643202/   -  person Jim Mischel    schedule 29.12.2012
comment
Вы не можете вызывать функции, которые принимают объекты C++ в качестве аргументов.   -  person Hans Passant    schedule 29.12.2012
comment
Чтобы сделать это «С++ вызывает С#», я предлагаю вам вместо этого использовать COM. Создайте COM-объект в C# и используйте его в C++.   -  person Simon Mourier    schedule 29.12.2012


Ответы (1)


Решение найдено!

Прежде всего, спасибо всем, кто откликнулся. Освоение новых технологий (для меня) было немного сложным). @Jim: см. РЕДАКТИРОВАТЬ, которую я добавил. MQL (язык метатрейдера) может быть основан на C++, но он серьезно ограничен разработчиками приложения. Так что никаких типов wchar. @Simon: добавление ссылки на пакет NuGet «UnmanagedExports» будет размещать оболочки и обрабатывать исправления CIL для вас, чтобы вы могли сосредоточиться на своем коде. Ссылка, которую я включил в вопрос, детализирует это.

Было две проблемы с кодом как есть:

  1. В приведенном примере кода строковые аргументы в функции С# были объявлены как LPWStr (широкие строки). Просмотр их в отладчике показал, что в них есть китайские символы. ЛПС работает нормально.

    public static int ReplaceString(
        [In, Out, MarshalAs(UnmanagedType.LPStr)] StringBuilder str,
        [MarshalAs(UnmanagedType.LPStr)]string a, 
        [MarshalAs(UnmanagedType.LPStr)]string b)
    
  2. Пример кода также имел указатель на строку, объявленную в качестве аргумента в вызывающем (собственном) коде. Удаление этого и использование класса StringBuilder для изменения строки в управляемом коде С# сработало.

    #import "MT4Lib.dll"
        int ReplaceString(string str,string a,string b);
        int Add(int x, int y);
    #import
    
person Harrison Stacked    schedule 30.12.2012
comment
Если кто-то пытается маршаллировать строки в терминалы MQL, эта ссылка будет очень полезна: mql5.com/ ru/статьи/249 - person opewix; 20.05.2016