问题
I have a simple application that loads an unmanaged dll and passes a few string values to it from C#. But in the C++ dll application, I receive an exception :: Tried to access a read/write protected memory. My DLL Import looks like this:
[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);
and the C++ Declaration is like
extern "C"
__declspec(dllexport) int DumpToDBLogFile( int loggingLevel, int jobId, int threadId, string procName, string message )
{
//access strings..
}
Help please!!!
回答1:
string != LPStr
try:
extern "C"
__declspec(dllexport) int DumpToDBLogFile( int loggingLevel, int jobId, int threadId, char* procName, char* message ) { //access strings..
}
回答2:
I would modify the pinvoke signature....
[DllImport("X.dll", CallingConvention = CallingConvention.Cdecl) ] public static extern int DumpToDBLogFile(int loggingLevel, int jobId, int threadId, StringBuilder procName, StringBuilder message);
And from the managed side use the StringBuilder class initialized....
StringBuilder sbProcName = new StringBuilder(1024); StringBuilder sbMessage = new StringBuilder(1024);
Then pass in the sbProcName
and sbMessage
to the DumpToDBLogFile
...
Hope this helps, Best regards, Tom.
来源:https://stackoverflow.com/questions/2380594/passing-c-sharp-string-to-unmanaged-c-dll