如何从C#调用C ++ DLL函数

丹尼尔·M

我正在尝试从C#应用程序中访问显微镜。SDK是用C ++编写的,我无法将Dll添加为我的应用程序中的引用(由于它们是非托管代码)。结果,我发现我将需要使用DllImport才能将函数与C#一起使用。

不幸的是,这似乎让我感到头疼。

例如,一些C ++代码(来自SDK附带的示例应用程序):

interface Camera;
typedef Camera * CameraHandle;

struct CameraInfo
{
  wchar_t               camera_name[64];        // camera head type
  wchar_t               controller_name[64];    // controller type
  wchar_t               firmware_version[64];   // firmware version
  long                  lib_id;                 // library ID
  long                  controller_id;          // controller ID
  long                  camera_id;              // camera ID
  CameraHandle          handle;                 // handle to opened camera
  long                  status;                 // status (0 = available)
  CameraInfo()
  {
    memset(this,0,sizeof(*this));
  }
};
typedef struct CameraInfo CameraInfo;

CamDiscoverCameras(OUT const struct CameraInfo ** info, OUT long * count);

这是稍后使用的方式:

CamResult               result;          //enum CamResult{...}
const CameraInfo*       camera_info  = NULL;
long                    camera_count = 0, pre_lib_id, pre_controller_id;

result = CamDiscoverCameras(&camera_info, &camera_count);

如何将其转换为C#代码?我已经尝试过类似的方法:

    [StructLayout(LayoutKind.Sequential)]
    struct CameraInfo
    {
        string              camera_name;            // camera head type
        string              controller_name;        // controller type
        string              firmware_version;       // firmware version
        int                 lib_id;                 // library ID
        int                 controller_id;          // controller ID
        int                 camera_id;              // camera ID
        public IntPtr       handle;                 // handle to opened camera
        int                 status;                 // status (0 = available)
    }

    [DllImport("Cam.dll", EntryPoint = "CamDiscoverCameras")]

但是基本上我不知道自己在做什么以及下一步需要做什么(例如,如何定义函数,如何处理C ++代码中的“接口”,是否正确转换了结构等等) 。

阿洛夫琴

首先,要将这些wchar_t数组转换为.NET,string您需要设置其他属性

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
struct CameraInfo
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
    string camera_name;            // camera head type
...

接下来,该方法CamDiscoverCameras返回一个指向struct指针,因此在.NET中,您实际上将收到一个IntPtr,然后使用Marshal.PtrToStructure方法将该指针转换为struct

[DllImport("Cam.dll", EntryPoint = "CamDiscoverCameras")]
// you can create enum of ints here and return it
static extern int CamDiscoverCameras(out IntPtr info, out int count);

CameraInfo DiscoverCameraInfos()
{
    IntPtr info; int count;
    int camResult = CamDiscoverCameras(out info, out count);
    var camInfo = (CameraInfo) Marshal.PtrToStructure(info, typeof(CameraInfo));
    // cleanup code - pass your IntPtr to C++ code
    // for it to delete the struct as it seems it was allocated there
    return camInfo;
}

而且不要忘了清理-从您的代码看来,该结构已在C ++代码中的某个位置分配,因此您可能必须将IntPtr传递回C ++代码才能对其进行取消分配。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何调用C DLL函数C ++ / CLI

来自分类Dev

从C#中的C ++ DLL P /调用DLL函数

来自分类Dev

从dll调用C函数后,C#代码中的ArithmeticException

来自分类Dev

调用更改C#中传递的参数的C dll函数

来自分类Dev

从C#调用C ++ DLL函数时崩溃

来自分类Dev

如何在C ++ / CLI DLL中从C#应用程序调用函数?

来自分类Dev

如何从Windows Phone上的C#项目调用C ++ DLL函数

来自分类Dev

C#导出函数dll

来自分类Dev

从C#调用Advapi32.dll本机EventWrite函数?

来自分类Dev

从C#调用Advapi32.dll本机EventWrite函数?

来自分类Dev

Web Service C#中DLL的调用函数动态

来自分类Dev

查找调用函数C#的代码的DLL名称

来自分类Dev

C# - 从动态库 dll 调用函数

来自分类Dev

VB5 dll,如何从C#(.NET 4.5)调用函数

来自分类Dev

如何在c#中调用csImageFile.dll(com)函数

来自分类Dev

向 C# asp.net 项目添加 DLL 引用后如何调用函数

来自分类Dev

如何将C函数签名转换为C#并在本机DLL中调用该函数?

来自分类Dev

如何从C#调用Jquery函数

来自分类Dev

如何从.Net / C#调用Schannel函数

来自分类Dev

如何从Java调用C#函数

来自分类Dev

如何从JavaScript调用C#函数?

来自分类Dev

如何从UnityScript调用C#函数

来自分类Dev

如何从JS调用c#函数?

来自分类Dev

C#如何从通用代码调用函数

来自分类Dev

Delphi如何使用typedef void *参数调用C ++ dll函数?

来自分类Dev

C ++如何从dll函数调用中获得正确的回报

来自分类Dev

调用函数C#

来自分类Dev

从Python调用C DLL函数时出错

来自分类Dev

从C#Ironpython调用.dll函数