簡體   English   中英

通過Net Core將C ++數組傳遞到C#層

[英]Passing a C++ Array to C# Layer through Net Core

我有一個本機庫,我想做的是向該本機庫編寫一個.NET Core包裝器。

在本機方面,我有一個名為OnSpeechEnded的事件:

virtual void OnSpeechEnded(SpeechEndInfo seInfo) = 0;

原生結構SpeechEndInfo具有以下結構:

struct SpeechEndInfo
{
    std::vector<AudioData> UntouchedData;
    std::vector<AudioData> AudioAfterPostSpeechUntilSilenceTrigger;
};

相應的.NET標准類:

 public struct SpeechEndedInfo
    {
        public SpeechEndedInfo(short[] untouchedData, short[] audioAfterPostSpeechUntilSilenceTrigger)
        {
            UntouchedData = new short[untouchedData.Length];
            untouchedData.CopyTo(UntouchedData, 0);


            AudioAfterPostSpeechUntilSilenceTrigger = new short[audioAfterPostSpeechUntilSilenceTrigger.Length];
            audioAfterPostSpeechUntilSilenceTrigger.CopyTo(AudioAfterPostSpeechUntilSilenceTrigger, 0);


        }

        public short[] UntouchedData { get; set; }
        public short[] AudioAfterPostSpeechUntilSilenceTrigger { get; set; }
    };

在.NET Standard方面,定義了以下委托:

delegate void OnSpeechEndedInter(
            [In, MarshalAs(UnmanagedType.LPArray)] short[] untouched, 
            int untouchedSize, 
            [In, MarshalAs(UnmanagedType.LPArray)] short[] audioAfterPostSpeechUntilSilenceTrigger,
            int audioAfterPostSpeechUntilSilenceTriggerSize);

宣告pinvoke:

[DllImport("VadLite.Pinvokable.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern void RegisterToSpeechEndedEvent(IntPtr parameters, [MarshalAs(UnmanagedType.FunctionPtr)]OnSpeechEndedInter onSpeechEndedInter);

聲明_onSpeechEndedInter:

 private OnSpeechEndedInter _onSpeechEndedInter;

為事件分配方法:

 _onSpeechEndedInter = invokedMethod;

...

void invokedMethod(short[] untouchedData, 
            int untouchedSize, 
            short[] audioAfterPostSpeechUntilSilenceTrigger,
            int audioAfterPostSpeechUntilSilenceTriggerSize)
        {
            OnSpeechEnded?.Invoke(new SpeechEndedInfo(untouchedData, audioAfterPostSpeechUntilSilenceTrigger));
        }

最后,發送本地數組的代碼:

RegisterToSpeechEndedEvent(
        void * possiblyOperations,
        void __stdcall onSpeechEndedListener(const int16_t* pUntouchedData, int pUntouchedDataSize, const int16_t *vAudioAfterPostSpeechUntilSilenceTrigger, int vAudioAfterPostSpeechUntilSilenceTriggerSize))
    {

        auto op = (OperationParameters *)possiblyOperations;
        op->OnSpeechEnded([onSpeechEndedListener](SpeechEndInfo ssInfo) {


            std::vector<int16_t> untouchedData;
            std::vector<int16_t> audioAfterPostSpeechUntilSilenceTrigger;

            for (auto & audioData : ssInfo.UntouchedData)
            {
                untouchedData.insert(untouchedData.end(), audioData.Samples, audioData.Samples + audioData.SampleCount);
            }


            for (auto & audioData : ssInfo.AudioAfterPostSpeechUntilSilenceTrigger)
            {
                audioAfterPostSpeechUntilSilenceTrigger.insert(audioAfterPostSpeechUntilSilenceTrigger.end(), audioData.Samples, audioData.Samples + audioData.SampleCount);
            }



            onSpeechEndedListener(untouchedData.empty() ? nullptr : untouchedData.data(),
                    (int)untouchedData.size(),
                    audioAfterPostSpeechUntilSilenceTrigger.empty() ? nullptr : audioAfterPostSpeechUntilSilenceTrigger.data(),
                    (int)audioAfterPostSpeechUntilSilenceTrigger.size());

        });

運行測試程序並在本機端獲取有意義的數組大小之后,C#數組UntouchedData和AudioAfterPostSpeechUntilSilenceTrigger似乎總是具有大小1。

可能有一個我錯過的細節。 如果需要,我可以提供更多詳細信息。 謝謝。

太好了,終於找到了問題所在。 在委托聲明中,我只需要引入參數SizeParamIndex

delegate void OnSpeechEndedInter(
            [In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] short[] untouched, 
            int untouchedSize, 
            [In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] short[] audioAfterPostSpeechUntilSilenceTrigger,
            int audioAfterPostSpeechUntilSilenceTriggerSize);

由於封送拆封器無法確定非托管數組的大小,因此必須考慮方法的簽名和從零開始的索引,將其作為單獨的參數傳遞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM