using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace main
{
class Program
{
[DllImport("C:\\Users\\9l\\Desktop\\projects\\interfaces\\Debug\\dll.dll")]
public static extern void Function1([MarshalAs(UnmanagedType.Bool)]bool arg);
static void Main(string[] args)
{
Function1(true);
while (true);
}
}
}
Ошибка разбалансировки стека, C#
Вызов функции PInvoke "main!main.Program::Function1" разбалансировал стек. Вероятно, это вызвано тем, что управляемая сигнатура PInvoke не совпадает с неуправляемой целевой сигнатурой. Убедитесь, что соглашение о вызовах и параметры сигнатуры PInvoke совпадают с неуправляемой целевой сигнатурой.
Код приложения на C#:
Код:
Код библиотеки:
Код:
#include <iostream>
#include <stdio.h>
#include <windows.h>
extern "C" __declspec(dllexport) void Function1(bool arg);
extern "C" __declspec(dllexport) void Function1(bool arg)
{
std::cout << "Function1\n" << arg <<"\n";
}
#include <stdio.h>
#include <windows.h>
extern "C" __declspec(dllexport) void Function1(bool arg);
extern "C" __declspec(dllexport) void Function1(bool arg)
{
std::cout << "Function1\n" << arg <<"\n";
}
Подскажите в чём причина. Заранее спасибо
C/C++ экспорты должны быть __stdcall
Вот пример dll'ки:
Код:
#include <iostream>
#include <stdio.h>
#include <windows.h>
interface I
{
virtual void Function1() = 0;
};
class A: public I
{
void Function1()
{
std::cout << "A.Function1\n";
};
};
extern "C" __declspec(dllexport) void __stdcall Function1(I* i);
extern "C" __declspec(dllexport) void __stdcall Function1(I* i)
{
std::cout << "Function1\n";
i = new A();
}
#include <stdio.h>
#include <windows.h>
interface I
{
virtual void Function1() = 0;
};
class A: public I
{
void Function1()
{
std::cout << "A.Function1\n";
};
};
extern "C" __declspec(dllexport) void __stdcall Function1(I* i);
extern "C" __declspec(dllexport) void __stdcall Function1(I* i)
{
std::cout << "Function1\n";
i = new A();
}
Цитата: 9l.
О! Да, спасибо. И ещё один вопрос чтобы не плодить темы. Как передать интерфейс I из библиотеки в C# программу
C# никак. Такой интероп можно только в C++/CLI, либо через COM.
А не подскажите статейки на эту тему написания COM на C++ и последующего использования его в C#?
Спасибо огромное за помощь :)