использование класса, определенного в C++ dll в коде c#

64
задан Dan Vogel 24 November 2008 в 18:49
поделиться

6 ответов

Нет никакого способа непосредственно использовать класс C++ в коде C#. Можно использовать PInvoke косвенным способом получить доступ типу.

основной шаблон - то, что для каждой функции членства в классе Foo, создайте связанную функцию лица, не являющегося членом какой-либо организации, которая звонит в функцию членства.

class Foo {
public:
  int Bar();
};
extern "C" Foo* Foo_Create() { return new Foo(); }
extern "C" int Foo_Bar(Foo* pFoo) { return pFoo->Bar(); }
extern "C" void Foo_Delete(Foo* pFoo) { delete pFoo; }

Теперь это - вопрос PInvoking эти методы в Ваш код C#

[DllImport("Foo.dll")]
public static extern IntPtr Foo_Create();

[DllImport("Foo.dll")]
public static extern int Foo_Bar(IntPtr value);

[DllImport("Foo.dll")]
public static extern void Foo_Delete(IntPtr value);

, оборотная сторона, у Вас будет неловкий IntPtr для раздавания, но это - несколько простой вопрос для создания класса обертки C# вокруг этого указателя для создания более применимой модели.

, Даже если Вы не владеете этим кодом, можно создать другой DLL, который обертывает исходный DLL и обеспечивает небольшой уровень PInvoke.

84
ответ дан milleniumbug 7 November 2019 в 12:11
поделиться

Вы, возможно, должны записать посреднический DLL (в C++, возможно), который обрабатывает это для Вас и представляет интерфейс, в котором Вы нуждаетесь. Ваш DLL ответил бы за загрузку стороннего DLL, создание экземпляра этого объекта C++ и представления его функций членства по мере необходимости через любой API, который Вы разрабатываете. Вы тогда использовали бы P/Invoke, чтобы достигнуть Ваш API и чисто управлять объектом.

Примечание: Для API Вашего DLL попытайтесь сохранить типы данных ограниченными примитивами (долго, интервал, символ*, и т.д.) для предотвращения граничных проблем модуля.

2
ответ дан Brian 7 November 2019 в 12:11
поделиться

Я соглашаюсь с JaredPar. Создание экземпляров неуправляемых классов в управляемом коде не должно быть возможным.

Другая вещь - если бы Вы могли бы перекомпилировать DLL в управляемом С++ или сделать COM-компонент из нее, это было бы намного легче /

2
ответ дан Paul Kapustin 7 November 2019 в 12:11
поделиться

Путем я сделал, это путем создания тонкой обертки Управляемого С++ вокруг моего неуправляемого DLL C++. Управляемая оболочка содержит классы "прокси", которые переносят неуправляемый код, представляющий интерфейс, это необходимо приложению.NET. Это немного удваивает работу, но она позволяет довольно бесшовную операцию в нормальных средах. Вещи действительно становятся более хитрыми с зависимостями при некоторых обстоятельствах (таких как ASP.NET), но Вы, вероятно, не столкнетесь с этим.

2
ответ дан Joris Timmermans 7 November 2019 в 12:11
поделиться

Здесь образец, как назвать метод класса C++ от VB - для C#, только необходимо переписать пример программы на Шаге 4.

4
ответ дан Dmitry Khalatov 7 November 2019 в 12:11
поделиться

myfile.i

%module learnaboutswig

class A

{

public:

    void boringfunction(char *charstr);
};

загрузите большой глоток с swig.org

потяните-c ++ - до-диез myfile.i

посмотрите на вывод, посмотрите, будет ли он работать на Вас.

3
ответ дан astronought 24 November 2019 в 15:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: