Нет никакого способа непосредственно использовать класс 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.
Вы, возможно, должны записать посреднический DLL (в C++, возможно), который обрабатывает это для Вас и представляет интерфейс, в котором Вы нуждаетесь. Ваш DLL ответил бы за загрузку стороннего DLL, создание экземпляра этого объекта C++ и представления его функций членства по мере необходимости через любой API, который Вы разрабатываете. Вы тогда использовали бы P/Invoke, чтобы достигнуть Ваш API и чисто управлять объектом.
Примечание: Для API Вашего DLL попытайтесь сохранить типы данных ограниченными примитивами (долго, интервал, символ*, и т.д.) для предотвращения граничных проблем модуля.
Я соглашаюсь с JaredPar. Создание экземпляров неуправляемых классов в управляемом коде не должно быть возможным.
Другая вещь - если бы Вы могли бы перекомпилировать DLL в управляемом С++ или сделать COM-компонент из нее, это было бы намного легче /
Путем я сделал, это путем создания тонкой обертки Управляемого С++ вокруг моего неуправляемого DLL C++. Управляемая оболочка содержит классы "прокси", которые переносят неуправляемый код, представляющий интерфейс, это необходимо приложению.NET. Это немного удваивает работу, но она позволяет довольно бесшовную операцию в нормальных средах. Вещи действительно становятся более хитрыми с зависимостями при некоторых обстоятельствах (таких как ASP.NET), но Вы, вероятно, не столкнетесь с этим.
Здесь образец, как назвать метод класса C++ от VB - для C#, только необходимо переписать пример программы на Шаге 4.
myfile.i
%module learnaboutswig
class A
{
public:
void boringfunction(char *charstr);
};
загрузите большой глоток с swig.org
потяните-c ++ - до-диез myfile.i
посмотрите на вывод, посмотрите, будет ли он работать на Вас.