Как распределить параметр const char* в указателе функции, который используется для отправки данных из C++ dll в C#, чтобы избежать сбоя сборки выпуска

Я регистрирую указатель на функцию, которая принимает строку в качестве параметра в DLL C++, которая используется для отправки текста обратно в приложение C#. Я попытался маршалировать строковый параметр как IntPtr и BStr в дополнение к другим. С отладочной сборкой у меня нет сбоев. При сборке релиза данные возвращаются корректно (проверено с журналом в текстовый файл). Тем не менее программа C# аварийно завершает работу с AccessViolationException.

Вот код:

A: используя BStr

C++:

typedef void(*callbackFunction)(BSTR resultDataJson);
 extern "C" DLLEXPORT int setReceiveFunction(callbackFunction funcPointer)
{       
    //function pointer is stored
    return 0;
}
//send the data back with function pointer
void MyClass::sendCallback(const QByteArray& msg)
{   
    if (this->m_callbackFunctionForReceivedData != nullptr)
    {
        BSTR resultMsg = this->ANSItoBSTR(msg.data());
        this->m_callbackFunctionForReceivedData(resultMsg);
    }   
}

C#:

[UnmanagedFunctionPointer(CallingConvention.StdCall)]
 public delegate void receiveCallbackData([MarshalAs(UnmanagedType.BStr)]string resultDataJson);

    [DllImport("./myDll.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]

    static public extern int setReceiveFunction([MarshalAs(UnmanagedType.FunctionPtr)] receiveCallbackData functionCallback);
//callback function where data are received
private void functionCallback(string receivedJsonData)
{
    //The received string can be logged here and looks correct.
}

Б. используя IntPtr

typedef void (*callbackFunction)(const char* resultDataJson);
 extern "C" DLLEXPORT int setReceiveFunction(callbackFunction funcPointer)
{       
    //function pointer is stored
    return 0;
}
//send the data back with function pointer
void MyClass::sendCallback(const QByteArray& msg)
{   
    if (this->m_callbackFunctionForReceivedData != nullptr)
    {
       this->m_callbackFunctionForReceivedData(msg.data());
    }   
}

C#:

 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
    public delegate void receiveCallbackData(IntPtr resultDataJson);

    [DllImport("./MyDll.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]

    static public extern int setReceiveFunction([MarshalAs(UnmanagedType.FunctionPtr)] receiveCallbackData functionCallback);

 private void functionCallback(IntPtr receivedJsonDataInt)
 {
        string receivedJsonData = Marshal.PtrToStringAnsi(receivedJsonDataInt);
         //The received string can be logged here and looks correct.
 }

Оба работают в Debug, но в Release. Зачем? Каково решение этой проблемы? Спасибо за вашу помощь!

0 ответов

Другие вопросы по тегам