Передача строки c # в неуправляемую DLL c ++ - PullRequest
5 голосов
/ 04 марта 2010

У меня есть простое приложение, которое загружает неуправляемую 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..
}

Помогите пожалуйста !!!

Ответы [ 2 ]

7 голосов
/ 04 марта 2010
string != LPStr

попробовать:

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

}
2 голосов
/ 04 марта 2010

Я бы изменил подпись 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 ...

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

...