Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为非托管(C+;+;)代码编写托管包装器-自定义类型/结构 我试图为这个C++库想出一个简单的包装器;我以前只做过非常简单的p/invoke互操作,比如一个带有原始参数的函数调用 那么,给定上面的C++函数,例如,我应该怎么处理返回类型和参数?< /P>_C#_.net_C++_Interop_Pinvoke - Fatal编程技术网

C# 为非托管(C+;+;)代码编写托管包装器-自定义类型/结构 我试图为这个C++库想出一个简单的包装器;我以前只做过非常简单的p/invoke互操作,比如一个带有原始参数的函数调用 那么,给定上面的C++函数,例如,我应该怎么处理返回类型和参数?< /P>

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的定义为:
#定义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;
...
}