Как импортировать и использовать неуправляемый класс C ++ из C #? - PullRequest
2 голосов
/ 18 января 2011

У меня есть родной C ++ dll, некоторые заголовочные файлы и библиотека импорта.Есть ли способ, как создать экземпляр объекта в C #, который определен в dll?

Два известных мне способа:

  1. , чтобы обернуть код C ++ в COM
  2. для использования DLLImport и внешних функций C

Ответы [ 2 ]

7 голосов
/ 18 января 2011

C ++ / CLI - ваш друг для этого.Однако вы столкнетесь с одной проблемой: невозможно хранить стандартные объекты C ++ внутри классов ссылок или значений C ++ / CLI (для .NET).Поэтому вам придется прибегнуть к следующему классу (который вы можете изменить), который я использую в производственном коде:

#pragma once
#include <boost/shared_ptr.hpp>

template <typename T>
ref class Handle
{
    boost::shared_ptr<T>* t;

    !Handle() 
    {
        if (t != nullptr)
        {
            delete t;
            t = nullptr;
        }
    }

    ~Handle() { this->!Handle(); }

public:
    Handle() : t(new boost::shared_ptr<T>((T*)0)) {}

    Handle% operator=(T* p)
    {
        if (p != t->get()) t->reset(p);
        return *this;
    }

    static T* operator&(Handle% h) { return h.t->get(); }
    static boost::shared_ptr<T> operator->(Handle% h) { return *h.t; }

    T& reference() { return *t->get(); }
    T const& const_reference() { return *t->get(); }
};

Использование: Handle<MyCppClass>^ handle; внутри класса C ++ / CLI.Затем вы реализуете методы-заглушки, перенаправляя их члену handle.Объекты сборки мусора будут вызывать деструкторы экземпляра класса C ++, если на него больше нет указателя:

public ref class Foo
{
    void bar() { handle->bar(); }

internal:
    Handle<CppNamespace::Foo>^ handle;
};
3 голосов
/ 18 января 2011

Я думаю, что вы выбираете только создание оболочки класса C ++ / CLI (так что вы можете ссылаться на нее как класс ac #), иначе вы не можете создать экземпляр класса c ++ (неуправляемый) из кода c #.

Альтернативой может быть «уродливый» способ: создать экземпляр класса c ++ с помощью функции ac, но вы будете относиться к классу как к пустому указателю внутри кода c #, поэтому вы с ним ничего не сделаете (кроме случаев, когда вы создаете другие функции).взаимодействовать с этим классом; только функции C)

C # понимает C, если вы хотите, чтобы он понимал C ++, вы должны использовать C ++ / CLI

PS C # имеет некоторое базовое понимание классов C ++,но речь идет только о преобразовании данных класса (я имею в виду байты: поля) в некоторые пригодные для использования данные в C # (есть некоторые атрибуты), но не позволит работать с такими методами и подобными вещами (полностью избегайте - мое предложение).

...