P /调用C#到C ++

时间:2010-10-28 13:31:17

标签: c# c++ mono pinvoke

我正在尝试学习如何在RedHat上使用Mono一起运行C#和C ++代码。为了学习如何让两者互操作以便在我从事更大的项目时受到更多的教育,我正在愚弄。

我遇到一个问题,我正在从C#到我的C ++代码进行P / Invoke调用,并且抛出异常。使用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 个答案:

答案 0 :(得分:1)

您是否正在使用嵌入(也就是说,您在单声道运行时中构建自己的可执行文件)?在这种情况下,可能性通常是两个:

  • 你有一个错字
  • 在优化二进制函数
  • 期间删除了编译器/链接器

要检查其中一项,请运行:

nm your_program | grep Foobar

并查看可执行文件your_program中是否存在具有该名称的符号。 如果您看到一个受损的名称,则表示extern“C”未在您的代码中正确应用。

如果您不使用嵌入,则需要在DllImport中使用动态库名称而不是__Internal(并检查拼写错误以及上面的链接器优化问题)。

答案 1 :(得分:0)

为什么“__Internal”?这适用于Mono运行时中的P / Invoking符号或嵌入Mono运行时的程序。你的C ++代码是如何编译和链接的?

答案 2 :(得分:0)

我看到了这个确切的问题,objdump -T和objdump -t在主机二进制文件上有所不同。
它缺少'D'标志,这意味着向gcc链接器添加-rdynamic。