【问题标题】:Call a c++ dll with stl container from .net从 .net 调用带有 stl 容器的 c++ dll
【发布时间】:2015-08-03 08:20:53
【问题描述】:

在原生 dll 中具有以下功能:

double sum (std::vector<double> vals)
{
    double s = 0.0;
    for (size_t = 0; i < vals.size(); i++)
    {
        s += vals[i]
    }
    return s;
}

如何使它可以从 .net (c#) 调用?

问题是,vector&lt;double&gt; 没有配对。

是否可以更改 c++ 端以使调用成为可能? (不放弃任何std c++特性,包括调用其他c++库的能力)

【问题讨论】:

    标签: c++ .net dll stl


    【解决方案1】:

    这是不可能的,也不应该这样做:do not pass stl classes over dll interface

    但是,您可以创建一个可以很容易地被 c# 调用的 c 函数。作为参数,您可以传递双精度的 c 数组和第二个参数 - 数组的长度。包装函数可以将其转换为 std::vector 并调用原始函数。

    double sumWrapper(double* pointerToDoubleArray, unsigned int numberOfElements) {
        //convert and call sum
    }
    

    这个 c 函数可以由 C++ 调用,如 here 所述,使用自定义编组。另一种选择是简单的包装器生成器 (swig) 来自动生成 c-wrapper 函数和一个在 dll 中调用 C++ 函数的 c# 函数。

    您拥有的另一个选项是添加一个 C++/Cli 包装函数,该函数可以从 C# 调用,并将 .net 的双精度数组转换为 stl 向量。

    【讨论】:

    • 我如何从 .net 端调用它? (有一个 List 作为源)
    • @AndrásKovács 这解释了如何使用 swig 将 c++ 与 c# 接口 swig.org/tutorial.html
    猜你喜欢
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    相关资源
    最近更新 更多