2011-11-11 69 views
0

我發現在這裏有類似的問題,涉及用C#封裝非託管C++,但它們似乎都是關於特定的實現問題。我想知道使用C#和非託管C++時的一般方法。例如,我有很多用非託管C++編寫的類,我希望能夠通過.NET使用(理想情況下用Excel中的VBA)。到目前爲止,我一直在使用託管的C++/CLI來完成這項工作,但是我注意到了一些我寧願避免使用的語言。進一步閱讀,似乎我可以用C#封裝我的非託管C++,然後直接訪問.NET(同時完全避免託管的C++/CLI)。這是可能的,如果是的話,最好的方法是什麼?感謝您的幫助。圍繞非託管C++的C#包裝器

+1

COM是一個選項。它有一些古怪。好吧,好幾個。 –

+0

@HansPassant:我第二個。特別是如果目標是綁定到VBA/Excel。 –

回答

1

你有三種選擇:

  • 使用C++/CLI包裝。如果您針對.NET,則爲理想的解決方案。您可以訪問.NET世界中的所有內容。你可以用它包裝你的C++庫,然後從C#/ whatever中使用它。
  • Ditch .NET,並可能在ATL的幫助下製作一個COM包裝器。這有點難度,但您可以從VBA/Excel更輕鬆地調用您的代碼。如果你願意,你仍然可以從.NET調用你的COM類。
  • 將您的代碼編譯爲本地DLL並使用C#中的P/Invoke。請注意,由於沒有任何東西是自動的,因此這個解決方案充其量是乏味的

如果你的目標是真正的Excel/VBA,因爲你要創建COM對象,我會選擇2並直接使用ATL創建COM類。儘管這完全繞開了.NET,但是使用.NET來連接C++代碼和Excel對我來說一直是個麻煩。

1

如果您想完全避免使用C++/CLI並使用純C#來訪問您的本機代碼,那麼它必須通過直接的P/Invoke方法。如果您有大量非託管代碼,這幾乎肯定不是理想選擇。個人而言,我認爲「最佳」解決方案是繼續使用C++/CLI編寫圍繞您的本機代碼的託管包裝,這些代碼公開最簡單的公共接口以降低複雜性。

+2

Pinvoke對C++類無能爲力。只有C風格的函數可以被調整。 –