Как вы используете технику (описанную) для работы со структурами C и указателями из .Net? - PullRequest
2 голосов
/ 13 июля 2010

Как вы используете метод, описанный здесь для работы со структурами C из .Net?

Конечно, мне нужен пример кода - из 3 частей: объявления C частей, C ++ обтекания вокруг C иC # acsessing.

Итак, что мне интересно:

C структура A имеет в качестве одного из своих параметров структуру B, которая состоит по крайней мере из двух типов, один из которых является указателем на некоторую переменную C, которая должнаобъявляется.

Нам нужен доступ из C # .Net ко всем структурам A и B и его параметрам, а также к этой переменной C.

Как это сделать?

1 Ответ

2 голосов
/ 22 июля 2010

Предположим, что это C-структуры в файле с именем structs.h

struct StructB
{
    int bMember1;
    int bMember2;
    int* bMember3;
};

struct StructA
{
    struct StructB aMember1;
};

В новом проекте DLL VC ++ включите поддержку Common Language RunTime (старый синтаксис) и убедитесь, что исключения C ++ отключены. Постройте это для цели выпуска.

extern "C"
{
    #include "structs.h"
}

namespace Wrapper
{
    public __gc class NewStructB
    {
        private:
            StructB b;

        public:
            NewStructB()
            {
            }

            ~NewStructB()
            {
            }

            int getBMember1()
            {
                return b.bMember1;
            }

            void setBMember1(int value)
            {
                b.bMember1 = value;
            }

            int getBMember2()
            {
                return b.bMember2;
            }

            void setBMember2(int value)
            {
                b.bMember2 = value;
            }

            int* getBMember3()
            {
                return b.bMember3;
            }

            void setBMember3(int* value)
            {
                b.bMember3 = value;
            }
    };

    public __gc class NewStructA
    {
        public:
            NewStructB* b;

            NewStructA()
            {
                b = new NewStructB();
            }

            ~NewStructA()
            {
                delete b;
            }

            void ShowInfo()
            {
                System::Console::WriteLine(b->getBMember1().ToString());
                System::Console::WriteLine(b->getBMember2().ToString());
                System::Console::WriteLine((*b->getBMember3()).ToString());
            }
    };
};

Затем создайте новое консольное приложение C # и создайте ссылку на файл .dll, который мы только что создали. В разделе «Свойства проекта»> «Построить» установите флажок «Разрешить небезопасный код».

static void Main(string[] args)
{
    int toBePointed = 12345;

    Wrapper.NewStructA a = new Wrapper.NewStructA();

    a.b.setBMember1(10);
    a.b.setBMember2(20);

    unsafe
    {
        a.b.setBMember3(&toBePointed);
    }

    a.ShowInfo();

    Console.ReadKey();
}

Как видите, оригинальная StructA в некотором роде устранена !! И я не знаю другого способа получить доступ к членам структуры C напрямую из C # из-за проблем с доступом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...