P / Invoke C # для C ++ - PullRequest
       311

P / Invoke C # для C ++

2 голосов
/ 28 октября 2010

Я пытаюсь научиться запускать код на C # и C ++ вместе, используя Mono в RedHat. Я дурачусь, чтобы научиться взаимодействовать друг с другом, чтобы быть немного более образованным, когда работаю над большим проектом.

У меня проблема с тем, что я делаю вызов P / Invoke из C # в мой код C ++, и создается исключение. Используя Mono, я могу получить код C ++ для вызова кода C # без проблем.

Мой метод C ++, который я хочу, чтобы C # вызывал, выглядит следующим образом.

extern "C"{
    void Foobar(){
         printf("Hooray!");
    }
}

Мой код C #, который у меня есть, использует следующие строки P / Invoke.

[DllImport ("__Internal", EntryPoint="Foobar")]
static extern void Foobar();

В моей программе на C # я звоню

Foobar();

дальше вниз в функции. Исключение, которое я ловлю, является исключением EntryPointNotFound. Я, наверное, упускаю из виду что-то глупое.

Я использовал http://www.mono -project.com / Embedding_Mono в качестве инструкций относительно того, как это сделать.

Любые предложения приветствуются. Спасибо,

MJ

Ответы [ 3 ]

1 голос
/ 29 октября 2010

Используете ли вы встраивание (то есть вы создаете свой собственный исполняемый файл, который запускает моно среду выполнения)?В этом случае возможностей обычно два:

  • У вас есть опечатка
  • Компилятор / компоновщик удалил во время оптимизации функцию из вашего двоичного файла

Впроверьте либо, запустите:

nm your_program | grep Foobar

и посмотрите, присутствует ли символ с таким именем в исполняемом файле your_program.Если вы видите искаженное имя, это означает, что extern "C" не был правильно применен в вашем коде.

Если вы не используете встраивание, вам нужно использовать динамическое имя библиотеки, а не __Internal в DllImport (и проверитьдля опечаток и вышеупомянутой проблемы оптимизации компоновщика также.)

0 голосов
/ 10 марта 2012

Я видел именно эту проблему, objdump -T и objdump -t различались в двоичном файле хоста.
Отсутствовал флаг 'D', что означает добавление -rdynamic к компоновщику gcc.

0 голосов
/ 29 октября 2010

Почему "__Internal"? Это для символов P / Invoking во время выполнения Mono или для программы, встраивающей среду выполнения Mono. Как ваш код C ++ компилируется и связывается?

...