Как взаимодействовать с C ++ с пространством имен - PullRequest
3 голосов
/ 12 января 2011

У меня есть функция C ++, которую я хочу предоставить C # для потребления.Уловка в том, что объявление кода C ++ заключено в пространство имен :

namespace OhYeahNameSpace
{
 extern "C"  __declspec(dllexport) void Dummy();
}

Мой вопрос: как определить соответствующую структуру C #?Я считаю, что код C # должен быть осведомлен о существовании OhYeahNameSpace, я прав?

Редактировать: я думаю, что многие люди неправильно понимают мою точку зрения (нет, спасибо за опечатку в моем первоначальном примере;фиксированный).Я спрашиваю о том, как пройти, если есть пространство имен, для которого остановлена ​​экспортируемая функция.В этой части один ответ отсутствует, другой говорит, что это невозможно, и просит меня обернуть его, а другой в настоящее время имеет -1 голос.

Ответы [ 3 ]

3 голосов
/ 12 января 2011

Почему бы не перенести в C ++ / CLI?

//ohyeah.h
namespace OhYeahNameSpace
{
  public ref class MyClass
  {
     void Dummy();
  }
}

//ohyeah.cpp
#include "ohyeah.h"
namespace OhYeahNameSpace
{
void MyClass::Dummy()
{
// call the real dummy in the DLL
}

}
1 голос
/ 13 января 2011

Оберните как C и используйте P / Invoke:

--- OhYeahNameSpace_C.h ---
#ifdef __cplusplus
extern "C" {
#endif

void _declspec(dllexport) OhYeahNameSpace_Dummy();

#ifdef __cplusplus
}
#endif

--- OhYeahNameSpace_C.c ---
#include "OhYeahNameSpace_C.h"
#include <OhYeahNameSpace.h>

void OhYeahNameSpace_Dummy()
{
  ::OhYeahNameSpace::Dummy();
}

Пример не завершен на 100%, но вы понимаете суть.

0 голосов
/ 12 января 2011

Одним из возможных решений было бы использование P / Invoke (помимо уже упомянутой обертки в классе C ++ / CLI

в C ++ (я предполагаю, что ваша функция находится в проекте, в результате чего создается DLL с именем UnmanagedCpp.dll:

namespace OhYeahNameSpace
{
   extern "C" __declspec(dllexport) void Dummy(); //extern "C" to disable name mangling
}

в C #:

 class Program
 {
       [DllImport("UnmanagedCpp.dll")]
       public static extern void Dummy();

        static void Main(string[] args)
        {

            Dummy();
        }
 }

Приложение C # должно найти UnmanagedCpp.dll (то есть вы можете скопировать его в корзину exe)

EDIT:

У этого решения есть некоторые недостатки, которые следует учитывать. После комментариев некоторые вещи я не четко сформулировал, предлагая свое «решение».

  1. Упаковка в C ++ / CLI является предпочтительным решением.
  2. В настоящее время компилятор VS 2010 (и его предшественники) отключают искажение имен функций в пространствах имен, если функция экспортируется с помощью extern "C". Однако это считается ошибкой, и это означает, что это может быть исправлено в будущем. Я не буду затаить дыхание, пока они не сделают ... Ошибка, на которую ссылался один из комментаторов, сообщается в 2005 году и 5 лет спустя ... Кроме того, текущее поведение больше похоже на функцию IMHO. Если кто-то хочет, чтобы имя было правильно оформлено (также с именем пространства имен), то не следует объявлять его вне "C". Но это только мое личное мнение. Так что примите это во внимание.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...