Я использую платформу / invoke, и я пытаюсь упорядочить плавающие значения LPSTR и int для функции c ++, и я получаю следующую ошибку: При вызове функции PInvoke ‘Game! Game.Graphics :: CreateModel’ разбалансирован стек. Это вероятно потому, что управляемая подпись PInvoke не соответствует неуправляемой целевой подписи. Убедитесь, что соглашение о вызовах и параметры подписи PInvoke соответствуют целевой неуправляемой подписи.
Вот мой код C #:
public struct Graphics
{
[DllImport(@"Graphics.dll", EntryPoint = "StartGL")]
public static extern void StartGL();
[DllImport(@"Graphics.dll", EntryPoint = "CreateModel")]
public static extern void CreateModel([MarshalAs(UnmanagedType.LPStr)]string ModelPath, [MarshalAs(UnmanagedType.LPStr)]string TexturePath,float xposh, float yposh, float zposh, float rotAngleh, float xroth, float yroth, float zroth);
[DllImport(@"Graphics.dll", EntryPoint = "rotateModel")]
public static extern void rotateModel(int id,float rotAngle,float x, float y, float z);
}
class Program
{
static void Main(string[] args)
{
OpenGL();
}
static void OpenGL()
{
Graphics.CreateModel("box.obj","asd.png",0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
Graphics.rotateModel(0,1.5707963267948966192313216916398f, 1.0f, 0.0f, 0.0f);
Graphics.StartGL();
//end of program
}
и объявление функций c ++:
extern "C" __declspec(dllexport)void StartGL();
extern "C" __declspec(dllexport)void CreateModel(LPSTR ModelPath,LPSTR TexturePath,float xposh,float yposh,float zposh,float rotAngleh,float xroth,float yroth,float zroth)
{
m3Dobject mod = m3Dobject(ModelPath,TexturePath,xposh,yposh,zposh,rotAngleh,xroth,yroth,zroth);
Models.push_back(mod);
}
extern "C" __declspec(dllexport)void moveModel(int id,float x,float y,float z)
{
Models[id].xpos = x;
Models[id].ypos = y;
Models[id].zpos = z;
}
extern "C" __declspec(dllexport)void rotateModel(int id,float rotAnglef,float x,float y,float z)
{
Models[id].rotAngle = rotAnglef;
Models[id].xrot = x;
Models[id].yrot = y;
Models[id].zrot = z;
}
Заранее благодарны за Вашу помощь.
По умолчанию в C ++ используется __cdecl
для соглашения о вызовах, но C # по умолчанию __stdcall
, Таким образом, вам нужно указать это в объявлении PInvoke, то есть:
[DllImport(@"Graphics.dll", EntryPoint = "StartGL", CallingConvention=CallingConvention.Cdecl)]
Других решений пока нет …