C#呼び出しによるC++のダイナミックライブラリdllを実現

        実際のプロジェクト プロセスでは、特定の関数を完了するために C++ プロジェクトで C# dll が呼び出されることがありますが、ネイティブ C++ が .NET プラットフォーム DLL を直接呼び出すことができないことは周知のとおりです。それで、これを行う方法はありますか?答えは「はい」です。

        OMCS リアルタイム オーディオおよびビデオ フレームワークを例に挙げてみましょう。OMCS WinPC SDK は C# で開発されています。C++ QT を使用して Windows アプリケーションを開発している一部の顧客は、オーディオおよびビデオの会話やリモート デスクトップ機能のために OMCS を呼び出したいと考えています。彼らはそうしますか?

       ネイティブ C++ は C# dll を呼び出すことはできませんが、マネージド C++ (C++/CLI) は C# dll を呼び出すことができるため、C++/CLI をネイティブ C++ と C# を接続するブリッジとして使用できます。

(1) 新しい C++/CLI ライブラリ (OmcsWrap など) を作成し、参照を追加して OMCS.dll を呼び出し、マネージ C++ 構文を使用して OMCS.dll 内のコンポーネントを呼び出し、標準の C/C++ インターフェイスを公開します。

(2) C++/CLI ライブラリをコンパイルして、OmcsWrap.dll および OmcsWrap.lib を取得します。ライブラリのインターフェイスは C++ 仕様に準拠しています。

(3) ネイティブ C++ プロジェクト (QT など) では、OmcsWrap.dll と OmcsWrap.lib をリンクするだけです。

1. OMCS を呼び出す C++/CLI の例: カメラの接続

      OMCS の基本的な使用法を理解していれば (知らない場合は、「OMCS Getting Started Demo: オーディオとビデオ、電子ホワイトボード、リモート デスクトップ機能の表示」を参照してください)、次の C++/CLI 呼び出しコードを簡単に実行できます。理解。

      C++/CLI コンソール プロジェクトを作成して、OMCS カメラ コネクタを介してオンライン ユーザーのカメラに接続し、カメラのビデオ画像ビットマップ データを取得する方法を示します。

using namespace System;
using namespace System::Drawing;
using namespace OMCS::Passive;
using namespace OMCS::Passive::Video;

ref class Tester
{
private:
    DynamicCameraConnector^ dynamicCameraConnector;
    int frameCount = 0;

public:

    Tester()
    {
        IMultimediaManager^ mgr = MultimediaManagerFactory::GetSingleton();

        //登陆 aa09
        mgr->Initialize("aa09", "", "127.0.0.1", 9900);
        Console::WriteLine(L"登录OMCS服务器成功!");
    }

    void Start()
    {
        dynamicCameraConnector = gcnew DynamicCameraConnector();
        dynamicCameraConnector->NewFrameReceived += gcnew ESBasic::CbGeneric<array<unsigned char, 1>^>(this, &Tester::OnNewFrameReceived);
        dynamicCameraConnector->ConnectEnded += gcnew ESBasic::CbGeneric<OMCS::Passive::ConnectResult>(this, &Tester::OnConnectEnded);

        //连接自己的摄像头
        dynamicCameraConnector->BeginConnect(L"aa09");
    }

    //摄像头图像数据
    void OnNewFrameReceived(array<unsigned char, 1>^ rgb24)
    {
        Bitmap^  bm = ESBasic::Helpers::ImageHelper::ConstructRGB24Bitmap(rgb24, dynamicCameraConnector->VideoSize.Width, dynamicCameraConnector->VideoSize.Height);

        ++this->frameCount;
        Console::WriteLine(L"收到图像帧:"  + this->frameCount.ToString("00000"));
    }

    //连接摄像头的结果
    void OnConnectEnded(OMCS::Passive::ConnectResult result)
    {
        if (result == ConnectResult::Succeed) //连接成功
        {
            Console::WriteLine(L"连接摄像头成功!");
        }
        else
        {
            Console::WriteLine(L"连接摄像头失败!原因:" + result.ToString());
        }
    }

    void Stop()
    {
        if (this->dynamicCameraConnector != nullptr)
        {
            if (this->dynamicCameraConnector->Connected)
            {
                this->dynamicCameraConnector->Disconnect(); //断开到目标摄像头的连接
                Console::WriteLine(L"断开摄像头连接器!");
            }

            this->dynamicCameraConnector = nullptr;
        }        
    }
};

(1) これは、受信したカメラ ビデオ画像フレームのフレーム番号を出力するだけですが、実際の使用シナリオでは、画像フレーム コールバックを QT に渡し、QT が UI コントロール上に画像をレンダリングできます。これにより、ビデオを見ることができるようになります。

(2) ここではカメラを例に挙げていますが、デスクトップも DynamicDesktopConnector を使用してまったく同じモードになっています。

(3) マイク サウンドの場合は、UI レンダリングが必要ないため、C++/CLI で MicrophoneConnector を直接呼び出すだけで十分です。ターゲットのマイクが正常に接続されると、ローカル コンピューターは自動的にそのサウンドを再生します。

       OMCS サーバーを起動した後 (この記事の最後からダウンロードできます)、この記事のコンソール プログラムを実行します。実行結果が以下のスクリーンショットに示されています。

 

 ここでは、C++/CLI が OMCS を呼び出す方法を簡単に示します。C++/CLI を呼び出すためのネイティブ C++ のライブラリのカプセル化に関しては、このライブラリがどの API を提供する必要があるかは、プロジェクトの特定の要件によって異なるため、ここでは例を示しません。 。

2. デモソースコードのダウンロード   

1. C++/CLI は OMCS デモを呼び出します: CppCli-CallOMCS-Demo.rar 

2. デモサーバー + C# クライアント: OMCS.Demos.Simplest.rar

3. Android クライアント: OMCS.AndroidDemo.rar

4. iOS クライアント: OMCS.IOSDemo.zip

5. ウェブ版:OMCS.WebDemo.rar

OMCSリアルタイムビデオ機能のデモ導入については、こちらをご覧ください。

おすすめ

転載: blog.csdn.net/zhuweisky/article/details/125128657
おすすめ