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

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

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

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

Так, так эксперты, пожалуйста, помогите мне с моей болью в ягодицах:)

1 ответов


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

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void MyDelegate();