在C#中调用C ++ dll中的向量参数? [英] Call vector parameter from C++ dll in C#?

查看:127
本文介绍了在C#中调用C ++ dll中的向量参数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

你好,

我有一个用C ++创建一个dll文件的功能,这是:

Hello,
I have a function to create a dll file with C++, this is:

#include "stdafx.h"
#include <vector>
using namespace std;

void _stdcall fn(vector<double> &p, int* pLength)
{
    int i=0;
    double p_=0;
    do
    {
        p.push_back(p_);
        p_=2*p_+1;
        i++;
    }
    while (a condition of p_);    // The condition of loop....

    *pLength=i;

    return;
}





我成功编译了它。 (testFile.dll)。

在C#中,我将此函数调用如下:



I compile it successfuly. (testFile.dll).
In C#, I call this function as follows:

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    class Program
    {
        [DllImport("testFile.dll")]
        public static extern void fn(List<double> p, ref int pLength);
        static void Main(string[] args)
        {
            // I want to declare an array with unknown length (size),
            // because the length is calculated from fn() function!!!
            // And pass to fn() function to get p[i].....
            List<double> p = new List<double>();
            int pLength = 0;
            fn(p, ref pLength);

            // Display pLength and p[i]
            Console.WriteLine(pLength);
            for (int i = 0; i < pLength; i++)
                Console.WriteLine(p[i]);
            Console.ReadKey();
        }
    }
}





成功建立。当我跑步时,我收到一个错误:



Build successfuly. When I run, I get an error:

Cannot marshal 'parameter #1': Generic types cannot be marshaled.





at



at

fn(p, ref pLength);







如何修复此错误并获得正确的结果?谢谢。




How to fix this error and to get correct result? Thanks.

推荐答案

C#List和C ++ std :: vector不兼容。它们在功能上是等效的但不是二进制兼容的。要从C#调用本机代码,您需要可以在托管代码和本机代码之间轻松编组的数据类型。



C# List and C++ std::vector are not compatible. They are functionally equivalent but not binary compatible. To call native code from C#, you need data types that can be easily marshalled between managed and native code.

#include "stdafx.h"
#include <vector>
using namespace std;
 
int _stdcall fn(double list[], int length)
{
    if (length < 20)
        return 0;

    double value = 0.f;
    for (int i = 0; i < 20; i++)
    {
        list[i] = value;
        value = value*2+1;
    }
    return 20;
}
</vector>





导入声明如下:





Import declared like so:

[DllImport("testFile.dll")]
public static extern int fn(double[] list, int length);





从C#调用函数如下:





Call the function from C# like so:

double[] list = new double[20];
int length = 0;
length = fn(list, list.Length);





在此示例中,返回值0表示列表太小了。



In this example, a return value of 0 means the list is too small.


这篇关于在C#中调用C ++ dll中的向量参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆