Передача c# представляет в виде строки к неуправляемому C++ DLL

У меня есть простое приложение, которое загружает неуправляемый dll и передает несколько строковых значений ему от C#. Но в C++ dll приложение, я получаю исключение:: Попробованный для доступа к чтению-записи защитил память. Мой Импорт DLL похож на это:

[DllImport("X.dll", CallingConvention = CallingConvention.Cdecl) ]
public static extern int
DumpToDBLogFile([MarshalAs(UnmanagedType.I4)]int loggingLevel,
                [MarshalAs(UnmanagedType.I4)]int jobId,
                int threadId,
                [MarshalAs(UnmanagedType.LPStr)]string procName,
                [MarshalAs(UnmanagedType.LPStr)]string message);

и Объявление C++ похоже

extern "C"    
__declspec(dllexport) int DumpToDBLogFile( int loggingLevel, int jobId, int threadId, string procName, string message )
{
    //access strings..
}

Справка!!!

5
задан Sani Singh Huttunen 4 March 2010 в 16:07
поделиться

2 ответа

string != LPStr

попробуйте:

extern "C"
__declspec(dllexport) int DumpToDBLogFile( int loggingLevel, int jobId, int threadId, char* procName, char* message ) { //access strings..

}
7
ответ дан 14 December 2019 в 01:06
поделиться

Я бы изменил подпись pinvoke ....

[DllImport("X.dll", CallingConvention = CallingConvention.Cdecl) ]
public static extern int
DumpToDBLogFile(int loggingLevel, int jobId, int threadId, StringBuilder procName, StringBuilder message);

А с управляемой стороны использовал инициализированный класс StringBuilder ....

StringBuilder sbProcName = new StringBuilder(1024);
StringBuilder sbMessage = new StringBuilder(1024);

Затем передайте sbProcName и sbMessage в DumpToDBLogFile ...

Надеюсь, это поможет, С уважением, Том.

2
ответ дан 14 December 2019 в 01:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: