2013-12-04 2 views
12

Мой проект успешно работает без ошибок в работе .NET Framework 3.5. Но, когда я нацеливаю его на работу .NET Framework 4. Я получил ошибку:Вызов функции PInvoke имеет несбалансированный стек. Вероятно, это связано с тем, что управляемый PInvoke .. (.NET 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) 

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

+1

http://stackoverflow.com/questions/13006580/error-calling-c-dll-function-in-c-sharp? предполагает, что тип возвращаемого значения должен быть 'DGNElemCore', а не' IntPtr' (btw: я обнаружил, что, выполнив поиск Google для 'DGNOpen pinvoke' - это был второй ответ ... сразу после вашего дубликата этого вопроса в MSDN) –

+0

@MarcGravell: Но 'DGNOpen' возвращает' DGNHandle', который, я считаю, является указателем void, поэтому 'IntPtr' является правильным типом. Или я что-то упустил? –

+0

* Вы знаете, как исправить эту ошибку? * Да, я знаю, как это сделать. Но это зависит от видения родных деклараций. Это interop. Задавать вопрос только с половиной интерфейса - это игра с хвостом на осле. –

ответ

30

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

, CallingConvention = CallingConvention.Cdecl)] 

Как взято с here.

Platform invoke

To improve performance in interoperability with unmanaged code, incorrect calling conventions in a platform invoke now cause the application to fail. In previous versions, the marshaling layer resolved these errors up the stack.

Debugging your applications in Microsoft Visual Studio 2010 will alert you to these errors so you can correct them. If you have binaries that cannot be updated, you can include the element in your application's configuration file to enable calling errors to be resolved up the stack as in earlier versions. However, this may affect the performance of your application.

+0

Спасибо, никто не очень! Я добавил «CallingConvention = CallingConvention.Cdecl» и успешно – taibc

+1

Добро пожаловать. – Ehsan

+0

Просто сохранил этот день с этим. Имел очень старую DLL, которая не играла бы хорошо с моими новыми проектами, пока я не добавлю соглашение о вызове. +1 :) –

Смежные вопросы