Подтвердить что ты не робот

Вызов функции PInvoke имеет несбалансированный стек. Вероятно, это связано с тем, что управляемый PInvoke.. (.NET 4)

Мой проект успешно работает без ошибок в работе .NET Framework 3.5. Но, когда я нацеливаю его на работу .NET Framework 4. Я получил ошибку:

" Вызов функции PInvoke имеет несбалансированный стек. Вероятно, это связано с тем, что управляемая подпись PInvoke не соответствует неуправляемой целевой сигнатуре."

Я использовал неуправляемую библиотеку, как показано ниже:

[StructLayout(LayoutKind.Sequential )]
public class DGNElemCore
{
    public int offset;
    public int size;
    public int element_id;
    public int stype;          
    public int level;
    public int type;
    public int complex;
    public int deleted;
    public int graphic_group;
    public int properties;
    public int color;
    public int weight;
    public int style;
    public int attr_bytes;       
    public IntPtr attr_data;  
    public int raw_bytes;
    public IntPtr raw_data;                 

}

[DllImport("DgnLib.dll", EntryPoint = "DGNOpen")]           
public static extern IntPtr  DGNOpen(string fileName, int bUpdate)

Вы знаете, как исправить эту ошибку?

4b9b3361

Ответ 1

Добавьте это вместе с импортом dll.

, CallingConvention = CallingConvention.Cdecl)]

Как взято из здесь.

Платформа invoke

Чтобы повысить производительность при взаимодействии с неуправляемый код, некорректные вызовы вызова в платформе что приложение не работает. В предыдущих версиях маршалинг слой разрешил эти ошибки в стеке.

Отладка ваших приложений в Microsoft Visual Studio 2010 предупредит вас об этих ошибках, чтобы вы может исправить их. Если у вас есть двоичные файлы, которые не могут быть обновлены, вы можете включить элемент в свой файл конфигурации приложения, чтобы включить ошибки вызова разрешили стек, как в более ранних версиях. Однако это может повлиять производительность вашего приложения.

Ответ 2

Я добавил CallingConvention.ThisCall при импорте библиотеки DLL, и она сработала

Пожалуйста, попробуйте другие константы и проверьте, какая из них работает в вашей среде