2010-10-28 4 views
2

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

У меня проблема с тем, что я делаю вызов 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

+0

Выстрел в темноте: вы пробовали 'EntryPoint =" _ Foobar "'? –

+0

Пробовал. Не повезло. –

ответ

1

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

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

Для проверки либо запустите:

nm your_program | grep Foobar

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

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

0

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

+0

Я использую моно! –

+0

Да, но обычная среда исполнения Mono не содержит символ Foobar ... –

0

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