gpt4 book ai didi

c# - 为非托管 (C++) 代码编写托管包装器 - 自定义类型/结构

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:58:07 27 4
gpt4 key购买 nike

faacEncConfigurationPtr FAACAPI faacEncGetCurrentConfiguration(
faacEncHandle hEncoder);

我正在尝试为这个 C++ 库设计一个简单的包装器;我以前从未做过比非常简单的 p/invoke 互操作更多的事情——比如一个带有原始参数的函数调用。

那么,以上面的C++函数为例,我应该如何处理返回类型和参数呢?

FAACAPI 定义为:#define FAACAPI __stdcall

faacEncConfigurationPtr 定义:

typedef struct faacEncConfiguration
{
int version;
char *name;
char *copyright;
unsigned int mpegVersion;
unsigned long bitRate;
unsigned int inputFormat;
int shortctl;

psymodellist_t *psymodellist;

int channel_map[64];

} faacEncConfiguration, *faacEncConfigurationPtr;

据我所知,这意味着函数的返回类型是对该结构的引用?

而 faacEncHandle 是:

typedef struct {
unsigned int numChannels;
unsigned long sampleRate;
...
SR_INFO *srInfo;
double *sampleBuff[MAX_CHANNELS];
...
double *freqBuff[MAX_CHANNELS];
double *overlapBuff[MAX_CHANNELS];

double *msSpectrum[MAX_CHANNELS];

CoderInfo coderInfo[MAX_CHANNELS];
ChannelInfo channelInfo[MAX_CHANNELS];
PsyInfo psyInfo[MAX_CHANNELS];
GlobalPsyInfo gpsyInfo;
faacEncConfiguration config;

psymodel_t *psymodel;

/* quantizer specific config */
AACQuantCfg aacquantCfg;

/* FFT Tables */
FFT_Tables fft_tables;

int bitDiff;
} faacEncStruct, *faacEncHandle;

所以在该结构中我们看到了很多其他类型...嗯。

本质上,我是想弄清楚如何在我的托管包装器中处理这些类型?
我是否需要在 C# 中创建这些类型/结构的版本?像这样:

[StructLayout(LayoutKind.Sequential)]
struct faacEncConfiguration
{
uint useTns;
ulong bitRate;
...
}

如果是这样,运行时能否自动将这些对象“映射”到彼此?而且,我是否必须为这些返回类型/参数类型层次结构中的所有类型创建这些“映射”类型,一直向下直到我到达所有原语?

我知道这是一个广泛的话题,任何关于快速了解我需要学习什么来实现这一目标的建议将不胜感激!谢谢!

最佳答案

您在正确的轨道上知道您需要如何创建表示用于 P/Invoke 的未管理结构的托管结构。

然而,这并不是与非托管库进行互操作的最佳策略,因为从 C# 使用此 API 仍然感觉像使用 C API - 创建并初始化一个结构,将其传递给一个函数并获得一些其他结构作为返回。

可以将 P/Invoke 用于未以其他方式公开为 .NET API 的奇怪函数调用,但对于完整的 API 包装器,我强烈建议使用托管 C++(C++/CLI)。它在为 .NET 创建非托管互操作层方面绝对是无与伦比的。

最大的挑战是将这个本质上是 C 的接口(interface)转换为面向对象的接口(interface),您可以在其中调用对象的方法,而不是使用所有公共(public)成员的结构调用全局函数。

当您开始为 P/Invoke 编写详尽的结构图时,您自己将不得不处理相当多的“魔法”,这些魔法控制着托管原始类型如何转换为非托管类型。通常,使用不正确的类型会导致运行时错误。

使用托管 C++(IJW - It Just Works),您可以在 C++ 中定义托管结构、类和接口(interface),这允许更自然地使用底层库,并为您的 C# 应用程序提供更原生的接口(interface)。

This是对 C++/CLI 的一个很好的概述。 MSDN 还提供了有关所有托管 C++ 功能的大量文档。

关于c# - 为非托管 (C++) 代码编写托管包装器 - 自定义类型/结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2941100/

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