2014-03-31 79 views
3

我需要使用this庫(Interception)。它寫在C++。簡而言之,它可以讓你操縱鍵盤或鼠標的輸入。 我需要做的是使用C#中的一些呼叫。如何使用C#中的C++代碼?

我不確定遵循哪條路。到目前爲止,我讀過您可以使用PinvokeC#內使用C++代碼。

我有一個關於PInvoke許多問題:
1)不要Pinvoke庫需要在一個特定的系統路徑(例如system32)被發現?

我讀過,獲得正確的PInvoke簽名可以是硬且容易出錯,因爲我不能在找到Interception任何PInvoke簽名PInvoke.net
2)這是否意味着我應該停止使用PInvoke

我也見過,但沒有深入細節,在Visual Studio中,當您創建項目時,您可以創建Visual C++->CLR->Class Library
3)我應該使用它來建立一個鏈接Interception?這個裝配可以用於C#嗎?

無論如何,如果C#替代Interception存在,我會用它來代替。

+1

從快速瀏覽起,它看起來像p/invoke應該可以,因爲它是一個使用句柄的平面API,就像winapi本身一樣,並且不會對類進行成員函數調用。當然,C++/CLI包裝器也是一個不錯的選擇。 –

+1

另外,如果不提供完整路徑,則p/invoke將使用默認的DLL搜索路徑。所以把DLL放在你的程序目錄中應該很好。 –

+0

看看[SWIG](http://www.swig.org/)了嗎?它可以在你的C#代碼可以使用的C++代碼周圍生成一個包裝API。 –

回答

3

1)不,如果庫與可執行文件位於相同的路徑,它將工作。

2)您只能將PInvoke與C函數一起使用,而不是C++對象。所以使用PInvoke直接調用攔截庫可能是不可能的。

3)您可以創建一個鏈接到攔截的C++/CLI庫。但是你將不得不創建自己的.NET對象來包裝Interception中的純C++對象。

我建議你閱讀一下關於在C++中編寫CLR的內容。在C++/CLI中製作CLR包裝器可能是最乾淨的方法。

+1

FWIW它被命名爲C++/CLI –

+0

@DavidHeffernan哎呀!糾正。 –

+1

好的。你的第一點是缺乏一點細節,第二點是錯誤的。在這種情況下,庫很容易被調用。沒有班級,互動非常常規。 –

2

使用系統DLL search path解析p/invoke導入。所以該DLL不需要在系統目錄中。它只需要在DLL搜索路徑中。事實上,你不應該把它放在系統目錄中,因爲系統擁有它。最好的地方是與可執行文件相同的目錄。首先搜索該位置。

問題庫中有一個相當小的頭文件,它提供了一個C風格的接口。這是一個相當簡單的p/invoke候選。您當然不會在pinvoke.net上找到任何翻譯,但翻譯此庫也不難。

您當然可以使用C++/CLI進行互操作。這會添加另一個圖層和另一個模塊。另一方面,你可以在安全鏈上輸入安全性。如果你對interop和p/invoke沒有信心和經驗,那麼C++/CLI可能會更有效率。

+0

編碼union-which-not-a-union('InterceptionStroke' - 'InterceptionKeyStroke''' InterceptionMouseStroke')可能有點棘手,需要一些'FieldOffsetAttribute'使它在C#中正常工作。 –

+0

@Ben它只是兩個結構體,然後是帶'FieldOffset(0)'的經典C#p/invoke聯合體。人們想知道爲什麼非託管代碼不使用聯合。 –