2013-11-20 35 views
2

我的c#真的很糟糕,我會拿一本書或一些東西來改善它。現在,我在c#wpf中有一個gui,在本地C++中有一個dll庫。我在互聯網上看到的所有的p/invoke教程都沒有類。P /調用c#和本機C++

這裏是我的代碼看起來像C++:

//Dostuff.h 

class foo { 
__declspec(dllexport) void dostuff(); 
} 

我怎麼會去調用從C#的dll?提前致謝。

+2

沒有看到課堂並不是偶然的。你不能捏住這個方法,你首先必須創建一個本地foo類的實例。你不能用pinvoke做。它必須是一個靜態方法。 –

+0

難道你不能調用'CoCreateInstance'或'CoGetClassObject'嗎?並用'DispInvoke'調用該方法? – Motes

+1

@注:'CoCreateInstance','CoGetClassObject'和'DispInvoke'是COM相關的東西。除非代碼是在考慮COM的情況下構建的,或者有人願意將COM接口改裝到它上面,否則它們不會有多大幫助。 – cHao

回答

1

沒有包裝的C++庫在構建它的C++編譯器之外通常沒有用處。 C#不會讓你使用這樣一個庫容易...即使你設法做到這一點,事情可能會以各種有趣的方式打破。

你有兩個相對安全的選擇,雖然:

  • 出口一組庫中的extern "C"包裝函數。你需要一個指向你想要使用的對象的指針,然後在該對象上調用一個函數。如果你走的是這條路線,那麼它就儘可能地接近普遍兼容;任何可以調用C函數的語言都可以使用該庫。
  • 如果您使用的是Visual C++,則可以針對.net專門做類似的事情。在C++/CLI中編寫一個可編譯爲.net的包裝器,但將調用轉發給本機庫。