実際のプロジェクト プロセスでは、特定の関数を完了するために 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リアルタイムビデオ機能のデモ導入については、こちらをご覧ください。