Я все еще новичок в C #, хотя у меня есть достаточный опыт работы с C ++. Мой текущий проект требует, чтобы я передавал данные назад и вперед между C ++ DLL и C # GUI. В основном я узнал, как это сделать, прочитав ответы здесь на stackoverflow. К сожалению, у меня есть проблема, которая застряла. DLL скомпилирована с использованием g ++ (gcc версии 4.2.1 mingw32-2), и я использую Visual Studio 2010 для создания графического интерфейса.
Моя проблема в том, что я могу получать данные в C # из некоторых функций DLL, а не из других. Сводит с ума то, что это кажется непоследовательным в том, что некоторые функции работают, а некоторые нет. Чтобы показать вам, что я имею в виду, я включил код импорта C # и декларации экспорта C ++ ниже. Я был бы очень признателен за некоторые советы по этому поводу, так как я действительно застрял в том, как это исправить.
Эта функция отлично работает:
[DllImport("mstTools.dll", EntryPoint = "mstLastError", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr LastError();
public static string mstGetLastError()
{
return Marshal.PtrToStringAnsi(LastError());
}
Это объявлено в заголовке DLL следующим образом:
extern "C" __declspec(dllexport) const char* mstLastError ();
Эта функция не работает и возвращает пустую строку:
[DllImport("mstTools.dll", EntryPoint = "mstGetMetadata", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr GetMetadata([MarshalAs(UnmanagedType.LPStr)]string StgMapName);
public static string mstGetMetadata( string StgMapName )
{
return Marshal.PtrToStringAnsi(GetMetadata( StgMapName ));
}
Он объявлен в DLL следующим образом:
extern "C" __declspec(dllexport) const char* mstGetMetadata ( char* CStgMapName );
Используя отладчик Visual Studio, я вижу, что импортированная функция DLL (GetMetadata) возвращает ноль.
И наоборот, функции, которые возвращают bool, работают, например:
[DllImport("mstTools.dll", EntryPoint = "mstMapExists", CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool mstMapExists([MarshalAs(UnmanagedType.LPStr)]string StgMapName);
Что объявлено в DLL следующим образом:
extern "C" __declspec(dllexport) bool mstMapExists ( char* CStgMapName );
Эта функция работает точно так, как я ожидал, в том смысле, что она возвращает true / false, когда должна.
Но функция, которая возвращает double, возвращает NaN:
[DllImport("mstTools.dll", EntryPoint = "mstGetResolution", CallingConvention =CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.R8)]
public static extern double mstGetResolution([MarshalAs(UnmanagedType.LPStr)]string StgMapName);
который объявлен в DLL как:
extern "C" __declspec(dllexport) double mstGetResolution ( char* CStgName );
Есть идеи о том, что происходит?
Спасибо и всего наилучшего,
Mike