2010-10-28 49 views
2

我在學習如何在RedHat上使用Mono一起運行C#和C++代碼。爲了學習如何讓兩者互操作,以便在我開展一個更大的項目時受到更多的教育,我正在愚弄。P /將C#調用到C++

我有一個問題,我正在從C#進行P/Invoke調用到我的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」'? – 2010-10-28 14:04:53

+0

嘗試過。沒有運氣。 – 2010-10-28 14:19:25

回答

1

您是否使用嵌入(即,您構建了自己的可執行文件,它位於單聲道運行時)?在這種情況下,possibilitites通常有兩種是:

  • 你有一個錯字,從優化過程中去除
  • 的編譯器/連接功能的二進制

要檢查兩種,運行:

nm your_program | grep Foobar

並查看該可執行文件中是否存在具有該名稱的符號your_program。 如果您看到一個錯位的名稱,這意味着extern「C」在代碼中沒有正確應用。

如果您不使用嵌入,則需要在DllImport中使用動態庫名稱而不是__Internal(並檢查是否存在拼寫錯誤和上述鏈接器優化問題)。

0

爲什麼「__Internal」?這適用於Mono運行時中的P/Invoking符號或嵌入Mono運行時的程序。你的C++代碼是如何被編譯和鏈接的?

+0

我正在使用單聲道! – 2010-10-29 13:19:45

+0

是的,但正常的Mono運行時不包含Foobar符號... – 2010-10-30 18:48:00

0

我看到了這個確切的問題,objdump -T和objdump -t在主機二進制文件上有所不同。
它缺少'D'標誌,這意味着向gcc鏈接器添加-rdynamic。