У меня есть простое приложение, которое загружает неуправляемый 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..
}
Справка!!!
string != LPStr
попробуйте:
extern "C"
__declspec(dllexport) int DumpToDBLogFile( int loggingLevel, int jobId, int threadId, char* procName, char* message ) { //access strings..
}
Я бы изменил подпись 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
...
Надеюсь, это поможет, С уважением, Том.