После переключения на VS2010, управляемый помощник по отладке отображает ошибку о несбалансированном стеке при вызове неуправляемой функции C ++ из приложения C #.
Обычные подозреваемые, кажется, не вызывают проблему. Есть что-то еще, что я должен проверить? Созданные на VS2008 приложения C ++ dll и C # никогда не имели проблем, никаких странных или таинственных ошибок - да, я знаю, что это мало что значит.
Вот что было проверено:
- Имя dll правильное.
- Имя точки входа правильное и проверено с помощью depen.exe - код должен использовать искаженное имя, и это действительно так.
- Соглашение о вызовах правильное.
- Размеры и типы кажутся правильными.
- Набор символов правильный.
- Кажется, что после игнорирования ошибки не возникает никаких проблем, и при запуске вне отладчика проблем не возникает.
C #:
[DllImport("Correct.dll", EntryPoint = "SuperSpecialOpenFileFunc", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, ExactSpelling = true)]
public static extern short SuperSpecialOpenFileFunc(ref SuperSpecialStruct stuff);
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
public struct SuperSpecialStruct
{
public int field1;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string field2;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string field3;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
public string field4;
public ushort field5;
public ushort field6;
public ushort field7;
public short field8;
public short field9;
public uint field10;
public short field11;
};
C ++:
short SuperSpecialOpenFileFunc(SuperSpecialStruct * stuff);
struct SuperSpecialStruct
{
int field1;
char field2[256];
char field3[20];
char field4[10];
unsigned short field5;
unsigned short field6;
unsigned short field7;
short field8;
short field9;
unsigned int field10;
short field11;
};
Вот ошибка:
Помощник по управляемой отладке
«PInvokeStackImbalance» обнаружил
проблема в «Управляемом пути приложения».
Дополнительная информация: звонок в
Функция PInvoke
SuperSpecialOpenFileFunc имеет
разбалансировать стек. Это скорее всего
потому что управляемая PInvoke подпись
не соответствует неуправляемой цели
подпись. Проверьте, что звонящий
условности и параметры
PInvoke подпись соответствует цели
неуправляемая подпись.