Полученное вами сообщение об ошибке содержит полезный совет:
Убедитесь, что соглашение о вызовах и параметры подписи PInvoke соответствуют целевой неуправляемой подписи.
У вас должно быть одинаковое соглашение о вызовах, указанное на обеих сторонах (сборка C ++ dll и C #).В C ++ вы можете указать это, добавив объявление функции с одним из __cdecl, __stdcall и т. Д.
extern "C"
{
__declspec(dllexport) int <strong>__stdcall</strong> Try(int v)
{
return 10 + v;
}
}
На стороне C # вы указываете его с атрибутом DllImport, по умолчанию используется CallingConvention.StdCall, который соответствует __stdcallв C ++, похоже, у вас есть __cdecl на стороне C ++.Чтобы решить эту проблему, используйте __stdcall в вашей DLL, как показано выше, или используйте CDecl в C # следующим образом:
class Program
{
[DllImport("TestLib.dll", <strong>CallingConvention=CallingConvention.Cdecl</strong>)]
public static extern int Try(int v);
static void Main(string[] args)
{
Console.WriteLine("Wynik: " + Try(20));
Console.ReadLine();
}
}