Я написал C DLL и некоторый C # код для тестирования, включая эту DLL и выполнение функций из нее. Я не слишком знаком с этим процессом и получаю исключение PInvokeStackImbalance всякий раз, когда моя функция DLL вызывается из исходного кода C #. Код выглядит следующим образом (я выделил большую часть кода, чтобы изолировать эту проблему):
C # Код включения:
using System;
using System.Runtime.InteropServices;
using System.IO;
namespace TestConsoleGrids
{
class Program
{
[DllImport("LibNonthreaded.dll", EntryPoint = "process")]
public unsafe static extern void process( long high, long low);
static void Main(string[] args)
{
System.Console.WriteLine("Starting program for 3x3 grid");
process( (long)0, (long)0 );
System.Console.ReadKey();
}
}
}
C ++ DLL код функции
extern "C" __declspec(dllexport) void process( long high, long low );
void process( long high, long low )
{
// All code commented out
}
Visual Studio сгенерировал код dllmain (я не понимаю эту конструкцию, поэтому я включаю ее)
// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
Подробности исключения:
При вызове функции PInvoke 'TestConsoleGrids! TestConsoleGrids.Program :: process' разбалансирован стек. Это вероятно потому, что управляемая подпись PInvoke не совпадает с неуправляемой целевой подписью. Убедитесь, что соглашение о вызовах и параметры подписи PInvoke соответствуют целевой неуправляемой подписи.