2010-05-21 64 views
3

我需要創建一個用於加密/解密文件的Windows Mobile應用程序(WinMo 6.x - C#)。但是,我有責任編寫AES-128加密算法和XTS作爲操作模式。 RijndaelManaged只是不削減它:(非常慢比DES和3DES CryptoServiceProviders:OC++ .NET DLL與C#託管代碼? (文件加密AES-128 + XTS)

我知道這一切都取決於我在以最有效的方式編寫算法有多好。(是的,我的自我有要從頭開始寫,但我可以看看@其他實現)

然而,不寫C++ .NET的DLL創建加密/解密算法+所有的文件處理和利用它從C#有一個顯着的性能優勢 OVER在完全託管的C#代碼中編寫加密算法+文件處理?

如果我使用C++ .NET創建加密算法,我應該使用MFC智能設備DLL還是ATL?有什麼不同,對我選擇哪一個有影響?我可以只添加從C#的C + + DLL的引用,或者我應該使用P/Invoke?

我比C++更能勝任C#,但性能起着主要作用,因爲我已經說服了我的講師AES是一種非常有效的資源受限設備加密算法。

感謝名單一堆:)

回答

1

寫「管理」程序會在C相同的性能++或C#或VB,因爲它們都編譯成IL反正。我不知道,但如果你編寫一個非託管的C++類庫並從託管的C#應用​​程序中調用它,你可能會在p/invoke期間失去一些性能,但是你的速度增加(來自非託管)可能足以證明它。 p/invoke可能會取消它從非託管獲得的任何潛在性能收益。

我不認爲如果沒有做到這兩種方式和測試肯定知道。

+0

Thanx :)所以即使我用C++編寫(MFC或ATL)它仍然被轉換爲IL?無論如何,我可以編寫一個本地C++ DLL的加密+文件處理,可以從C#中使用? – 2010-05-21 14:20:14

+2

@Ranhiru:是的,但你必須在託管/非託管代碼邊界上進行P/Invoke。 – 2010-05-21 14:22:29

+0

所以一個非本地的C++。DLL(MFC或ATL)只能作爲參考添加,因爲它可以用於C#DLL?並且一個本地C++ DLL必須被P/Invoke使用。我是否正確?我應該用什麼樣的項目爲智能設備編寫本地C++ DLL?對不起,如果這是混淆:( – 2010-05-21 14:27:32

2

實際上,您的託管代碼將在第一次運行時進行JIT編譯,然後由操作系統進行緩存,因此沒有必要擔心這一點。
另外,無論您選擇哪種語言,只要它是.NET,它都會編譯爲CIL並需要JIT編譯。
如果您使用C++編寫純託管代碼,那可能會更快,但不一定。 Nate說,P/Invoke可能會減慢你的代碼速度。

您可以使用託管代碼或本機代碼編寫整個應用程序,但如果所有algorythms都相同,唯一的性能差異將在(第一次)啓動時間。而這通常可以忽略不計。 (CLR被優化以非常快地進行JIT編譯。)

注意:在JIT編譯過程中,CLR會優化你的代碼。有時JITted代碼的運行速度比純本地代碼快,這是因爲JIT編譯器優化得更好。