【问题标题】:C++ .NET DLL vs C# Managed Code ? (File Encrypting AES-128+XTS)C++ .NET DLL 与 C# 托管代码? (文件加密AES-128+XTS)
【发布时间】:2010-05-21 14:08:42
【问题描述】:

我需要创建一个用于加密/解密文件的 Windows Mobile 应用程序 (WinMo 6.x - C#)。但是,我有责任编写 AES-128 加密算法以及 XTS 作为操作模式。 RijndaelManaged 只是没有削减它 :( 比 DES 和 3DES CryptoServiceProviders 慢得多 :O

我知道这完全取决于我以最有效的方式编写算法的能力。 (是的,我自己必须从头开始编写它,但我可以看看@其他实现)

尽管如此,编写一个 C++ .NET DLL 来创建加密/解密算法 + 所有文件处理并从 C# 中使用它具有 显着的性能优势完全托管的 C# 代码中的加密算法 + 文件处理?

如果我使用 C++ .NET 创建加密算法,我应该使用 MFC Smart Device DLL 还是 ATL?有什么区别,对我选择哪一个有影响吗?我可以从 C# 添加对 C++ DLL 的引用还是应该使用 P/Invoke?

我在 C# 方面的能力胜过 C++,但性能起着重要作用,因为我已经说服我的讲师相信 AES 是一种非常有效的加密算法,适用于资源受限的设备。

感谢一堆:)

【问题讨论】:

    标签: c# c++ dll encryption aes


    【解决方案1】:

    实际上,您的托管代码将在第一次运行时进行 JIT 编译,然后由操作系统缓存,因此无需担心。
    另外,无论你选择哪种语言,只要是.NET,都会编译成CIL,需要JIT编译。
    如果您用 C++ 编写纯托管代码,可能会更快,但不一定。

    正如 Nate 所说,P/Invoke 会减慢您的代码速度。

    您可以使用托管代码或本机代码编写整个应用程序,但如果所有算法都相同,则唯一的性能差异将在于(首次)启动时间。这通常可以忽略不计。 (CLR 已经过优化,可以非常快速地进行 JIT 编译。)

    附注:在 JIT 编译期间,CLR 将优化您的代码。有时 JITted 代码比纯原生代码运行得更快,这仅仅是因为 JIT 编译器优化得更好。

    【讨论】:

      【解决方案2】:

      编写“托管”程序在 C++、C# 或 VB 中将具有相同的性能,因为它们都编译为 IL。

      我不知道,但是如果您编写一个非托管 C++ 类库并从托管 C# 应用程序调用它,您可能会在 p/invoke 期间失去一些性能,但您的速度提高(来自非托管)可能足以证明它的合理性. p/invoke 有同样的机会可能会取消它因不受管理而带来的任何潜在性能增益。

      如果不同时做这两种方法并进行测试,我认为无论如何都无法确定。

      【讨论】:

      • Thanx :) 所以即使我用 C++(MFC 或 ATL)编写它仍然会转换为 IL?无论如何,我可以为加密 + 文件处理编写一个本机 C++ DLL,可以从 C# 中使用?
      • @Ranhiru:是的,但是您必须跨托管/非托管代码边界 P/Invoke。
      • 所以非本地 C++ .DLL(MFC 或 ATL)可以像 C# DLL 一样作为参考添加吗?并且 P/Invoke 必须使用本机 C++ DLL。我正确吗?我应该使用什么样的项目来为智能设备编写本机 C++ DLL?抱歉,如果这令人困惑:(
      猜你喜欢
      • 2013-01-16
      • 1970-01-01
      • 2018-01-08
      • 2015-03-10
      • 1970-01-01
      • 2021-12-09
      • 2021-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多