gpt4 book ai didi

c# - C# 和 C++ 之间的指针 - p/invoke

转载 作者:行者123 更新时间:2023-11-28 03:20:30 24 4
gpt4 key购买 nike

您好,我正在尝试从 C# 调用一些 C++ 代码。所以我遵循了几个教程,amde 我自己的 dll,现在我从我的 c# 包装器中调用它。问题是,我有一个接收指针的函数,但我似乎无法让它工作,visual studio 只向我显示我不太理解的红色错误。有人可以告诉我我做错了什么吗?我还有一个问题,如果 C++ 中的函数调用其他函数,所有数据都将保持不变,对吗?因为我传递的这个数组将在 dll 内部进行操作,之后我将调用 dll 中的其他函数来获取结果——我担心函数调用之间数据会丢失!

谢谢!

动态链接库.h #包括

   #include <stdio.h> 

#include <stdlib.h>

#include <math.h>

#include <string>

#include <vector>

#include <fstream>

#include <sstream>

#include <cstring>

#include <fstream>

#include <iomanip>

#include <cstdlib>

#include <string>

#include <cstring>

#include "opencv\ml.h"

struct points{
double x;
double y;
double z;
};

#define db at<double>


extern "C" __declspec(dllexport) points * mapear_kinect_porto(points pontos[]);


CvERTrees * Rtree ;


extern "C" __declspec(dllexport) void calibrate_to_file(points pontos[]);

extern "C" __declspec(dllexport) int calibration_neutral();

extern "C" __declspec(dllexport) int EmotionsRecognition();

C# 包装器

             [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct points
{

/// double
public double x;

/// double
public double y;

/// double
public double z;
}


class CPlusPlusWrapper
{

/// Return Type: void
///pontos: points*
[System.Runtime.InteropServices.DllImportAttribute("DLLTUT.dll", EntryPoint = "calibrate_to_file")]
public static extern void calibrate_to_file(ref points pontos);
public unsafe void calibrate_file()
{

points[] shit = new points[8];
points*[] pBLA; //error here!!!!
pBLA = &shit;
// calibrate_to_file(pbla);
}

顺便说一句,我使用了 p/invoke 助手,我得到了这个

public partial class NativeConstants {

/// db -> at<double>
/// Error generating expression: Expression is not parsable. Treating value as a raw string
public const string db = "at<double>";
}

[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct points {

/// double
public double x;

/// double
public double y;

/// double
public double z;
}

public partial class NativeMethods {

/// Return Type: points*
///pontos: points*
[System.Runtime.InteropServices.DllImportAttribute("<Unknown>", EntryPoint="mapear_kinect_porto")]
public static extern System.IntPtr mapear_kinect_porto(ref points pontos) ;


/// Return Type: void
///pontos: points*
[System.Runtime.InteropServices.DllImportAttribute("<Unknown>", EntryPoint="calibrate_to_file")]
public static extern void calibrate_to_file(ref points pontos) ;


/// Return Type: int
[System.Runtime.InteropServices.DllImportAttribute("<Unknown>", EntryPoint="calibration_neutral")]
public static extern int calibration_neutral() ;


/// Return Type: int
[System.Runtime.InteropServices.DllImportAttribute("<Unknown>", EntryPoint="EmotionsRecognition")]
public static extern int EmotionsRecognition() ;

}

最佳答案

您似乎在尝试调用名为 calibrate_to_file 的函数。它接收一个 points 数组。 p/invoke 是:

[DllImportAttribute("DLLTUT.dll", CallingConvention=CallingConvention.Cdecl)]
public static extern void calibrate_to_file(points[] pontos);

绝对不需要不安全的代码。只需在您的调用代码中创建一个 points[] 类型的数组,然后调用 calibrate_to_file

您需要确保调用约定匹配。由于您没有在 C++ 代码中指定调用约定,因此我假定使用默认值 cdecl

该结构可以简单地声明为

[StructLayout(LayoutKind.Sequential)]
public struct points
{
public double x;
public double y;
public double z;
}

mapear_kinect_porto 函数会更加棘手,因为您要返回一个指针作为函数返回值。使用参数而不是函数返回值返回该信息会更容易。

我最好的建议是将这个问题分解成小块。获得最简单的功能。然后继续下一个功能。等等。不要试图一次解决整个问题。然后,当它不可避免地失败时,您将不知道在哪里寻找错误。

关于c# - C# 和 C++ 之间的指针 - p/invoke,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15591568/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com