Вызов функции C ++ из модуля C # вызывает случайные сбои - PullRequest
1 голос
/ 30 сентября 2019

Мой модуль C # должен связываться с dll C ++, который предоставляет набор функций и должен обрабатывать данные, возвращаемые вызываемой функцией.

Вот мой код C #, где вызывается функция C ++ (Npr),

 [DllImport("CppModule.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "Npr"), System.Security.SuppressUnmanagedCodeSecurity]
    public static extern IntPtr Npr([MarshalAs(UnmanagedType.LPWStr)]string moduleIDCur,
        [MarshalAs(UnmanagedType.LPWStr)]string mName,
        [MarshalAs(UnmanagedType.LPWStr)]string threadID,
        [MarshalAs(UnmanagedType.LPWStr)]string sessionID,
        [MarshalAs(UnmanagedType.LPWStr)]string reqID,
        [MarshalAs(UnmanagedType.LPWStr)]string siteID,
        [MarshalAs(UnmanagedType.LPWStr)]string siteName,
        [MarshalAs(UnmanagedType.LPWStr)]string nodeOrder,
        [MarshalAs(UnmanagedType.LPWStr)]string dateTime,
        [MarshalAs(UnmanagedType.LPWStr)]string rType,
        [MarshalAs(UnmanagedType.LPWStr)]string rCode,
        [MarshalAs(UnmanagedType.LPWStr)]string headStr,
        [MarshalAs(UnmanagedType.LPWStr)]string cookStr,
        [MarshalAs(UnmanagedType.LPWStr)]string userAgent,
        int flag);

...
IntPtr rets =  Npr(reqHttp.Url.PathAndQuery,rAddr,Thread.CurrentThread.ManagedThreadId.ToString(),sessionID,reqGUID,
                           siteID,siteName,nodeStr,DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss", CultureInfo.GetCultureInfo("en-US")),reqHttp.RequestType,
                          HttpContext.Current.Response.StatusCode.ToString(), headers, cookieStr, uAgent,
                           flag);             // Native Call from C#
...

В CppModule.dll

EXTERN_C WCHAR* __cdecl Npr(WCHAR* testString,WCHAR* mname,WCHAR* threadID,WCHAR* sessionID,
                                         WCHAR* rID,WCHAR* siteID,WCHAR* siteName,WCHAR* nodeOrder,
                                         WCHAR* dateTime,WCHAR* rType,WCHAR* rCode,WCHAR* headStr,WCHAR* cookieStr,WCHAR* uAgent,int flag)
{ ... ...  return wcharPtr;}

Этот вызов функции Npr случайным образом выдает исключение. Сообщение об исключении: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. По номеру строки вызова функции Npr в C #. Я изменил эту функцию Npr, чтобы вернуть WCHAR * недавно , откуда происходит случайный сбой. Мне не хватает маршалинга, связанного с взаимодействием или подобного?

1 Ответ

1 голос
/ 04 октября 2019

Обычно в моих программах, если функция C ++ возвращает строку, я предпочитаю передать параметр StringBuilder, а затем изменить его.

Что-то вроде:

[DllImport("CppModule.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "Npr"), System.Security.SuppressUnmanagedCodeSecurity]
public static extern void Npr(StringBuilder returnValue, [MarshalAs(UnmanagedType.LPWStr)]string moduleIDCur,
    [MarshalAs(UnmanagedType.LPWStr)]string mName,
    [MarshalAs(UnmanagedType.LPWStr)]string threadID,
    [MarshalAs(UnmanagedType.LPWStr)]string sessionID,
    [MarshalAs(UnmanagedType.LPWStr)]string reqID,
    [MarshalAs(UnmanagedType.LPWStr)]string siteID,
    [MarshalAs(UnmanagedType.LPWStr)]string siteName,
    [MarshalAs(UnmanagedType.LPWStr)]string nodeOrder,
    [MarshalAs(UnmanagedType.LPWStr)]string dateTime,
    [MarshalAs(UnmanagedType.LPWStr)]string rType,
    [MarshalAs(UnmanagedType.LPWStr)]string rCode,
    [MarshalAs(UnmanagedType.LPWStr)]string headStr,
    [MarshalAs(UnmanagedType.LPWStr)]string cookStr,
    [MarshalAs(UnmanagedType.LPWStr)]string userAgent,
    int flag);
...
Npr(returnValue, reqHttp.Url.PathAndQuery,rAddr,Thread.CurrentThread.ManagedThreadId.ToString(),sessionID,reqGUID,
                       siteID,siteName,nodeStr,DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss", CultureInfo.GetCultureInfo("en-US")),reqHttp.RequestType,
                      HttpContext.Current.Response.StatusCode.ToString(), headers, cookieStr, uAgent,
                       flag);

...

В коде c ++:

EXTERN_C void __cdecl Npr(WCHAR * wcharPtr, WCHAR* testString,WCHAR* mname,WCHAR* threadID,WCHAR* sessionID, WCHAR* rID,WCHAR* siteID,WCHAR* siteName,WCHAR* nodeOrder, WCHAR* dateTime,WCHAR* rType,WCHAR* rCode,WCHAR* headStr,WCHAR* cookieStr,WCHAR* uAgent,int flag)
{ ... ... }
...