c++ - 将非托管 C++ 代码转换为托管 C++ 以便从 C# 调用

标签 c++ .net visual-studio unmanaged managed

我有一些需要大量二进制操作的 C# 代码,因此我编写了一个非托管 C++ 方法来替换其中一个 C# 方法。令我震惊的是,速度慢了 10 倍。我运行了一个配置文件,发现缓慢来自于调用外部方法的开销,而不是方法本身。

所以我想,如果我在托管 C++ 中编写方法,我将减少调用的开销,但仍具有 C++ 的速度。首先,这个假设是否成立?

这是我的非托管 C++ 代码:

#include "stdafx.h";

unsigned __int32 _stdcall LSB_i32(unsigned __int32 x)
{
    DWORD result;
    _BitScanForward(&result, x);
    return (unsigned __int32)result;
}

这是我的 C# 代码:

public static partial class Binary
{
    [DllImport(@"CPP.dll")]
    public static extern int LSB_i32(int value);
}

我是不是做错了什么?

如何将上述内容转换为托管 C++?我对此进行了一些浏览,但由于我不熟悉托管 C++,所以我没有深入了解。

最佳答案

您可以保留非托管方法,但不应经常从托管代码中调用它。例如,如果您在紧密循环中调用非托管方法,那么托管代码和非托管代码之间的编码开销将是巨大的。因此,您可以尝试将此循环放在非托管代码中,以便您只执行一次对该方法的调用。然后您只需支付一次编码费用,整个繁重的工作将在非托管代码中完成。

就将其转换为托管 C++ 而言,我非常怀疑这会给您带来比开始时更好的东西(即完全托管的 C# 代码)。

关于c++ - 将非托管 C++ 代码转换为托管 C++ 以便从 C# 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8628985/

相关文章:

c++ - 如何从 C++ 中的结构数组中删除一个项目?

javascript - 在数据属性中序列化对象的最可靠方法

c++ - Microsoft 重载 << 运算符示例会引发链接错误

c++ - 你怎么 "break"跳出一个函数?

c++ - 错误 "C++ requires a type specifier for all declarations whilst defining methods"

c++ - 如何优化共享库的大小?

c# - WebSocket 客户端的状态不会因网络丢失而改变

c# - 点网核心 3.1 : How to use AddJsonFile with absolute path to file?

visual-studio - 默认情况下解决 checkin 时的代码审查问题

visual-studio - 将 XML 架构添加到 Visual Studio