Изменение соглашения о вызовах делегата C# на CDECL

У меня была эта проблема с С#, когда я использовал DotNet1.1.

Проблема вот в чем. У меня есть неуправляемая dll, в которой есть функция, которая принимает указатель на функцию (среди других аргументов). Когда я объявляю DLLImport в коде C#, я передаю делегат. Но делегаты в C# имеют соглашение о вызовах stdcall, тогда как неуправляемая функция ожидает указатель на функцию cdecl. Таким образом, мой наивный подход привел к сбоям. Затем я нашел следующее: http://www.codeproject.com/KB/cs/cdeclcallback.aspx Какой-то парень написал отличную библиотеку, позволяющую изменить соглашение о вызове делегата путем, как я понял, взлома MSIL. Дела шли хорошо, пока...

Я перешел на VS2008 и новую версию .NET. В этой версии указанная выше библиотека не работает. Я не специалист по C# или .NET и, честно говоря, плохо понимаю, что делает его библиотека (хотя она и с открытым исходным кодом), поэтому даже не хочу пытаться адаптировать ее под новый .NET. Однако я надеюсь, что в более новой версии С# есть лучшее решение для моей проблемы.

Итак, ТАК знатоки, помогите пожалуйста с моей болью в ягодицах :)


person Armen Tsirunyan    schedule 01.03.2011    source источник


Ответы (1)


По умолчанию система p/invoke заключает ваш делегат в функцию stdcall. Вы можете изменить соглашение о вызовах сгенерированной оболочки, используя UnmanagedFunctionPointer атрибут:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void MyDelegate();
person David Heffernan    schedule 01.03.2011
comment
Могу ли я назначить ему обычную функцию С#? - person Armen Tsirunyan; 01.03.2011
comment
Спасибо большое. Работает отлично. Вы спасли мой день! - person Armen Tsirunyan; 01.03.2011
comment
кстати, вы можете сделать это в vb.net: ‹UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)› Public Delegate Sub my_callback_function(ByRef v As my_struct) - person sailfish009; 13.03.2018