Realice la biblioteca dinámica dll de C ++ llamando a C #

        En el proceso real del proyecto, a veces se llama a una dll de C# en un proyecto de C++ para completar una función específica.Todos sabemos que Native C++ no puede llamar directamente a una dll de plataforma .NET. Entonces, ¿hay alguna manera de hacer esto? La respuesta es sí.

        Tomemos como ejemplo el marco de trabajo de audio y video en tiempo real de OMCS. El SDK de WinPC de OMCS está desarrollado en C#. Algunos clientes que usan C++ QT para desarrollar aplicaciones de Windows desean llamar a OMCS para conversaciones de audio y video o funciones de escritorio remoto. ¿Qué debería ¿ellas hacen?

       Aunque Native C++ no puede llamar a C# dll, Managed C++ (C++/CLI) puede llamar a C# dll, por lo que C++/CLI se puede usar como puente para conectar Native C++ y C#.

(1) Cree una nueva biblioteca C++/CLI (como OmcsWrap), agregue referencias y llame a OMCS.dll, use la sintaxis de Managed C++ para llamar a los componentes en OMCS.dll y exponga las interfaces estándar de C/C++.

(2) Compile la biblioteca C++/CLI para obtener OmcsWrap.dll y OmcsWrap.lib. La interfaz de la biblioteca está en línea con la especificación C++.

(3) En un proyecto nativo de C++ (como QT), simplemente vincule OmcsWrap.dll y OmcsWrap.lib.

1. Ejemplo de C++/CLI llamando a OMCS: conectando una cámara

      Si comprende el uso básico de OMCS (si no lo sabe, puede consultar: Demostración de inicio de OMCS: audio y video, pizarra electrónica, pantalla de función de escritorio remoto ), entonces el siguiente código de llamada C++/CLI es fácil de entender.

      Vamos a crear un proyecto de consola C++/CLI para demostrar cómo conectarse a la cámara de cualquier usuario en línea a través del conector de cámara OMCS y obtener los datos de mapa de bits de la imagen de video de la cámara.

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) Esto es solo para imprimir el número de cuadro del cuadro de imagen de video de la cámara recibido. En un escenario de uso real, la devolución de llamada del cuadro de imagen se puede pasar a QT, y QT puede representar la imagen en el control de la interfaz de usuario. Esto le permitirá ver el video.

(2) Aquí, la cámara se toma como ejemplo y el escritorio también está exactamente en el mismo modo, utilizando DynamicDesktopConnector.

(3) Para el sonido del micrófono, es más simple, ya que no requiere representación de la interfaz de usuario, por lo que basta con llamar a MicrophoneConnector directamente en C++/CLI. Cuando el micrófono de destino se conecta con éxito, la computadora local reproducirá automáticamente su sonido.

       Después de iniciar el servidor OMCS (puede descargarlo desde el final del artículo), ejecute el programa de la consola en este artículo y el efecto de ejecución se muestra en la siguiente captura de pantalla:

 

 Aquí hay solo una breve indicación de cómo C++/CLI llama a OMCS. En cuanto a encapsular una biblioteca para que Native C++ llame a C++/CLI, qué API debe proporcionar esta biblioteca depende de los requisitos específicos del proyecto, por lo que no daré un ejemplo aquí. .

2. Descarga del código fuente de demostración   

1. C++/CLI llama a la demostración de OMCS: CppCli-CallOMCS-Demo.rar 

2. Servidor de demostración + cliente C#: OMCS.Demos.Simplest.rar

3. Cliente Android: OMCS.AndroidDemo.rar

4. Cliente iOS: OMCS.IOSDemo.zip

5. Web 版:OMCS.WebDemo.rar

Para ver la introducción de demostración de la función de video en tiempo real de OMCS, consulte aquí .

Supongo que te gusta

Origin blog.csdn.net/zhuweisky/article/details/125128657
Recomendado
Clasificación