Как создать .dll в Visual Studio 2008 для использования в приложении C #? - PullRequest
3 голосов
/ 18 мая 2009

У меня есть класс C ++, к которому я хотел бы получить доступ из приложения C #. Мне нужно получить доступ к конструктору и функции-члена. В настоящее время приложение принимает данные в виде stl::vector s, но я могу сделать какое-то преобразование, если это вряд ли будет работать?

Я нашел несколько статей в Интернете, в которых описывается, как вызывать библиотеки C ++ DLL, и некоторые другие, в которых описывается, как создавать проекты .dll для других целей. Я изо всех сил пытаюсь найти руководство по их созданию в Visual Studio 2008 для использования в приложении на C # (кажется, что есть несколько для VS 6.0, но большинство указанных опций, кажется, не появляются в версии 2008 ).

Если у кого-нибудь есть пошаговое руководство или достаточно простой пример, я был бы очень признателен.

Ответы [ 5 ]

3 голосов
/ 18 мая 2009

Самый простой способ взаимодействия между C ++ и C # - это использование управляемого C ++ или C ++ / CLI, как он называется. В VisualStudio создайте новый проект C ++ типа «Библиотека классов CLR». Существует новый синтаксис для частей, которые вы хотите сделать доступными для C #, но вы можете использовать обычный C ++ как обычно.

В этом примере я использую std::vector<int> только для того, чтобы показать, что вы можете использовать стандартные типы - однако в реальном приложении я бы предпочел использовать типы .NET, где это возможно (в данном случае System::Collections::Generic::List<int>).

#pragma unmanaged
#include <vector>
#pragma managed

public ref class CppClass
{
public:
   CppClass() : vectorOfInts_(new std::vector<int>)
   {}

   // This is a finalizer, run when GC collects the managed object
   !CppClass()
   { delete vectorOfInts_; }

   void Add(int n)
   { vectorOfInts_->push_back(n); }

private:
    std::vector<int>* vectorOfInts_;
};

РЕДАКТИРОВАТЬ: Изменен класс для хранения вектора по указателю, а не по значению.

3 голосов
/ 18 мая 2009

Если такая DLL неуправляемая. Вам придется использовать P / invoke. Определение функции p / invoke выглядит так:

[DllImport("Library_Name.dll", EntryPoint = "function")]
public static extern void function();

Если, с другой стороны, это управляемая (C ++ / CLI) DLL (или сборка). Вы можете получить к нему доступ, добавив ссылку на него в свой проект .NET.

EDIT: Я думаю, что я не ответил на ваш вопрос вообще. Но чтобы создать управляемую C ++ DLL для доступа из .NET, создайте новый проект на выбор: Visual C ++ / CLR / Библиотека классов. А затем просто добавьте свою выходную DLL в ваш проект C #.

Это сделало бы это. :)

1 голос
/ 18 мая 2009

Есть ли у вас C ++ exe-файл, который вы хотите пересобрать как dll? Или все, что у вас есть класс C ++?
Если все, что у вас есть, это класс C ++, вы можете подумать о создании .Net dll. Хотя вы не можете передавать типы stl из C # в C ++, я вполне уверен, что вы можете передавать управляемые типы .Net.
Если вы должны использовать типы stl в классе, вы можете преобразовать данные в класс C ++ или в вызывающее приложение.

0 голосов
/ 18 мая 2009

Я нашел учебник , который работает. Короткое замечание, однако, вы должны быть осторожны, чтобы скопировать .dll в тот же каталог, что и исполняемый файл. Я безуспешно пытался сказать исполняемому файлу, где была DLL, но в конце концов сдался.

0 голосов
/ 18 мая 2009

Использование неуправляемых C ++ Dll может быть очень утомительным в C #.

«Более простой» путь - поместить его в оболочку COM.

...