C# 为非托管(C+;+;)代码编写托管包装器-自定义类型/结构 我试图为这个C++库想出一个简单的包装器;我以前只做过非常简单的p/invoke互操作,比如一个带有原始参数的函数调用 那么,给定上面的C++函数,例如,我应该怎么处理返回类型和参数?< /P>
FAACAPI的定义为:C# 为非托管(C+;+;)代码编写托管包装器-自定义类型/结构 我试图为这个C++库想出一个简单的包装器;我以前只做过非常简单的p/invoke互操作,比如一个带有原始参数的函数调用 那么,给定上面的C++函数,例如,我应该怎么处理返回类型和参数?< /P>,c#,.net,c++,interop,pinvoke,C#,.net,C++,Interop,Pinvoke,FAACAPI的定义为:#定义FAACAPI uu stdcall faacEncConfigurationPtr的定义如下: faacEncConfigurationPtr FAACAPI faacEncGetCurrentConfiguration( faacEncHandle hEncoder); AFAIK这意味着函数的返回类型是对此结构的引用 faacEncHandle是: typedef struct faacEncConfiguration { int ve
#定义FAACAPI uu stdcall
faacEncConfigurationPtr的定义如下:
faacEncConfigurationPtr FAACAPI faacEncGetCurrentConfiguration(
faacEncHandle hEncoder);
AFAIK这意味着函数的返回类型是对此结构的引用
faacEncHandle是:
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;
所以在这个结构中我们可以看到很多其他类型的。。。嗯
从本质上讲,我正在试图找出如何在托管包装中处理这些类型?我需要用C#创建这些类型/结构的版本吗?大概是这样的:
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;
如果是这样,那么运行时能否自动将这些对象“映射”到彼此上?
而且,我是否必须为这些返回类型/参数类型层次结构中的所有类型创建这些“映射”类型,一直到我得到所有原语为止
我知道这是一个广泛的话题,任何关于我需要学习什么才能实现这一目标的建议都将不胜感激!谢谢 对于如何创建表示未更改结构的托管结构以用于p/Invoke,您的方法是正确的 但是,这并不是与非托管库进行互操作的最佳策略,因为从C#使用此API仍会感觉像使用C API—创建并初始化结构,将其传递给函数,然后获得其他结构作为回报 对于不作为.NET API公开的奇数函数调用,可以使用p/Invoke,但对于完整的API包装,我强烈建议使用托管C++(C++/CLI)。它在为.NET创建非托管互操作层方面绝对无与伦比 最大的挑战是将这个本质上是C的接口转换成一个面向对象的接口,在这个接口中调用对象以外的方法,而不是使用所有公共成员的结构调用全局函数 当您开始为p/Invoke编写复杂的结构图时,您将不得不处理相当多的“魔法”,这些魔法控制着托管基元类型如何转换为非托管类型。通常,使用不正确的类型会导致运行时错误
使用托管C++(IJW——它只是工作),您可以在C++中定义托管结构、类、接口,这允许更自然地使用底层库和更为本地的C语言应用程序接口。
是对C++/CLI的一个很好的概述。此外,MSDN对所有托管C++特性都有广泛的文档。 < P>是的,您需要在C语言中声明所有这些结构。请注意声明具有正确大小的成员。例如,“长”是C++中的32位,而C中是64位。对于C++中的指针或空洞,在C语言中使用IntPtr等。< /P>伟大的回答,谢谢你的信息,没有想到C++的管理,会尝试去研究它。到目前为止,我一直在继续C#尝试,尽管有点笨拙。。将其包装为:int FAACAPI faacencode(faacEncHandle-hEncoder,int32_t-inputBuffer,unsigned int-samplesInput,unsigned char*outputBuffer,unsigned int-bufferSize);为什么是未签名字符?那个映射到字符串了吗?“int”是否确实映射到Stimult.IN16(作为另一个回答?)等等,这些问题在托管C++解决方案中会更明显吗?嗯[很高兴能在纯.NET中正常工作:)]
[StructLayout(LayoutKind.Sequential)]
struct faacEncConfiguration
{
uint useTns;
ulong bitRate;
...
}