Использование C ++ DLL в C # - PullRequest
       26

Использование C ++ DLL в C #

0 голосов
/ 01 декабря 2009

Я пытаюсь использовать DLL, написанную на C ++, из приложения C #. У меня есть сторонний исходный код для dll C ++ (физический движок Cyclone) и я не хочу вручную переносить его на C #.

В проекте C ++
Я изменил его для вывода DLL. Я изменил его, чтобы использовать флаг / clr. Я изменил его, чтобы использовать многопоточную отладочную DLL (/ MDd), потому что она была единственной, совместимой с / clr и также скомпилированной.

В проекте C #
Я добавил ссылку на dll. Я использую пространство имен циклона.

Сначала под пространством имен не было абсолютно ничего. Я думаю, это потому, что в коде C ++ все классы были объявлены без модификаторов доступа, а по умолчанию это private. Поэтому для класса «Частица» я изменил определение на:

public class Particle
{
//...
}

Теперь я могу успешно объявить переменную типа Particle из кода C #. Однако intellesense и объектный браузер сообщают, что Particle является структурой (?), И она вообще не содержит никаких методов. Код c ++ объявляет несколько методов после модификаторов доступа public:, так что я не знаю, в чем проблема.

Например,

public:
void integrate(real duration);

Что я делаю не так?

Ответы [ 4 ]

2 голосов
/ 01 декабря 2009

Класс Particle не является управляемым классом, поэтому он рассматривается как структура. Вам нужно использовать ключевое слово ref, чтобы сделать его управляемым и собирать мусор. Вы также должны сделать то же самое для каждого другого класса, который ссылается на него, что может быть проблемой. Я думаю, что лучшее решение - создать управляемый класс-обертку, который использует класс Particle внутри. Затем на этот класс-оболочку может ссылаться .net.

См. здесь :

1 голос
/ 01 декабря 2009

Я на самом деле не сталкивался с вашей конкретной проблемой раньше, но раньше я использовал C ++ dll в c #. Обычно при вызове подобной dll вы используете ключевое слово dllImport . По сути, вы можете определить класс, который импортирует все типы и методы из c ++ dll. Затем вы можете вызвать эти классы-оболочки.

Я далеко не эксперт по этому вопросу, но я использовал его, чтобы получить доступ к методам win32 и некоторым другим библиотекам, которые мне нужно было использовать.

Эта ссылка на codeplex содержит несколько инструментов, которые могут помочь. Но самым важным, вероятно, является Interop Assistant. Он может генерировать оболочки C # для вашей d ++ c ++.

Это не совсем то, о чем вы спрашиваете, но я подумал, что это может помочь взглянуть в другом направлении.

0 голосов
/ 01 декабря 2009

У вас есть ссылка на COM Interop?

0 голосов
/ 01 декабря 2009

Попробуйте объявить класс c ++ с ключевым словом ref:

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