Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ошибка разбалансировки стека, C#

47K
09 ноября 2011 года
9l.
33 / / 04.05.2010
Подключается dll'ка к приложению на C#. При вызове функции происходит ошибка:
Вызов функции PInvoke "main!main.Program::Function1" разбалансировал стек. Вероятно, это вызвано тем, что управляемая сигнатура PInvoke не совпадает с неуправляемой целевой сигнатурой. Убедитесь, что соглашение о вызовах и параметры сигнатуры PInvoke совпадают с неуправляемой целевой сигнатурой.

Код приложения на C#:
Код:
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);
        }
    }
}


Код библиотеки:
 
Код:
#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";
}


Подскажите в чём причина. Заранее спасибо
277
09 ноября 2011 года
arrjj
1.7K / / 26.01.2011
C/C++ экспорты должны быть __stdcall
47K
09 ноября 2011 года
9l.
33 / / 04.05.2010
О! Да, спасибо. И ещё один вопрос чтобы не плодить темы. Как передать интерфейс I из библиотеки в C# программу
Вот пример 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();
}
5
10 ноября 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: 9l.
О! Да, спасибо. И ещё один вопрос чтобы не плодить темы. Как передать интерфейс I из библиотеки в C# программу

C# никак. Такой интероп можно только в C++/CLI, либо через COM.

47K
10 ноября 2011 года
9l.
33 / / 04.05.2010
А не подскажите статейки на эту тему написания COM на C++ и последующего использования его в C#?
5
10 ноября 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: 9l.
А не подскажите статейки на эту тему написания COM на C++ и последующего использования его в C#?


Думаю, проще всего вам будет написать обертку над этим интерфейсом на C++/CLI, которую в свою очередь использовать из C#. Статей на RSDN хватает.

47K
10 ноября 2011 года
9l.
33 / / 04.05.2010
Спасибо огромное за помощь :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог