Можна зателефонувати коду C ++ із C #?


86

Чи можна викликати код C ++, можливо, скомпільований як файл бібліотеки коду (.dll), з такої мови .NET, як C #?

Зокрема, код C ++, такий як мережева бібліотека RakNet.


Неконтрольований c ++ до керованого c #: c-sharpcorner.com/uploadfile/tanmayit08/…
Тайлер С. Лопер

Відповіді:


90

Одним з простих способів зателефонувати в C ++ є створення збірки обгортки в C ++ / CLI. У C ++ / CLI ви можете зателефонувати до некерованого коду так, ніби пишете власний код, але ви можете зателефонувати до коду C ++ / CLI з C # так, ніби він написаний на C #. Мова в основному була розроблена із взаємодією з існуючими бібліотеками як її "вбивча програма".

Наприклад - скомпілюйте це за допомогою перемикача / clr

#include "NativeType.h"

public ref class ManagedType
{
     NativeType*   NativePtr; 

public:
     ManagedType() : NativePtr(new NativeType()) {}
     ~ManagedType() { delete NativePtr; }

     void ManagedMethod()
      { NativePtr->NativeMethod(); } 
}; 

Потім у C # додайте посилання на свою збірку ManagedType і використовуйте її так:

ManagedType mt = new ManagedType();
mt.ManagedMethod();

Перегляньте цю публікацію в блозі, щоб отримати більш пояснений приклад.


2
посилання не працює для повідомлення в блозі :(
Vidar

9

Я не знайомий з бібліотекою, яку ви згадали, але загалом це можна зробити декількома способами:

  • P / Викликати експортовані функції бібліотеки
  • Додавання посилання на бібліотеку типу COM (у випадку, якщо ви маєте справу з об’єктами COM).

9

P / Invoke - приємна технологія, і вона працює досить добре, за винятком проблем із завантаженням цільового файлу DLL. Ми виявили, що найкращий спосіб зробити це - створити статичну бібліотеку власних функцій і зв’язати це з керованим проектом C ++ (або C ++ / CLI), який залежить від цього.


У мене були проблеми із зворотними викликами та p / invoke. Перехід до C ++ / CLI вирішив ці проблеми.
MedicineMan



2

Технологія, яка використовується для цього, називається P / Invoke ; ви можете шукати статті на цю тему. Зверніть увагу, що це для виклику C з C #, а не C ++ настільки. Тож вам потрібно буде обернути ваш код C ++ у оболонку C, яку експортує ваша DLL.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.