Skip to main content
SMeetingNet wraps the SMeeting.h C++ API in idiomatic C#: callbacks become events, media becomes strongly typed objects, and SMeetingEngine / SMeetingChannel implement IDisposable, so you never write callback vtables yourself. The call order is identical to the C++ quickstart. There are two layers:
  • SMeetingEngine—process-wide, one is enough. Login, the meeting management HTTP APIs, channel lifecycle, device enumeration, IM, resource drive
  • SMeetingChannel—one per meeting: entering, room and member data, in-meeting operations, media objects

Initialize the SDK

SetLanguage / Version / GetStatusMessage are static—no engine instance needed. Use SMeetingEngine.GetStatusMessage(code) for the text of a status code; its language follows SetLanguage (English until you call it).

Register engine-level events

Only callbacks that belong to no meeting live here: device changes, default device changes, network probe, IM, meeting-start reminder (MeetingStartMessage). Everything else is on SMeetingChannel.

Log in

Login is asynchronous—the result only arrives through the callback.

Create a meeting

If you already have a meeting id or room number, skip straight to the next step.

Enter a meeting

Two steps: CreateChannel only creates the object without entering; configure it, then call Enter(). As in C++, register the events before Enter()—the entering callbacks fire synchronously while enter is still running.
Set both RoomName (the display name) and StreamVendor before Enter(). When entering fails the channel object still exists and must be recycled with engine.LeaveChannel(channel).

Get room and member data

These return raw json whose schema belongs to the backend—parse it yourself. Each member’s published tracks live in its stream_tracks field (desc / kind / width / height / fps).

Camera

Microphone

Speaker (hear everyone)

Remote audio fetched with an empty uid is the channel mix, so opening it is enough to hear everyone— no per-member subscription:

Play remote video

A remote track is not a long-lived handle: the SDK destroys it once the member leaves, and the same (uid, desc) then resolves to null. Don’t cache SMeetingRemoteVideo—re-fetch it through GetRemoteVideo on every use. Local camera / screen objects are the opposite: they stay valid for the lifetime of the channel.
For window rendering just use the ready-made SMeetingHwndView(handle); to render into your own surface derive from SMeetingView and override UpdatePlanes (GetViewType returns SMeetingViewType.CallBack). Always RemovePlayView before disposing a SMeetingView, or the render thread may touch a freed object.

Share the screen

Enumerate share targets with engine.EnumScreen(): Type == 5 is a monitor (build the rectangle from X / Y / Width / Height), Type == 0 is a window (use Hwnd).

Chat and custom messages

Incoming messages arrive in the RoomChatMessage / RoomCustomMessage events.

Host operations

Local recording

Leave and release

Threading and lifetime

  • Except for the events raised while entering, all events arrive on SDK internal threads—marshal to your UI thread yourself (WinForms: BeginInvoke)
  • Async APIs taking an SMeetingCallback (Login / Enter / RequestOpenCamera, …) invoke the callback once, with (SMeetingStatusCode code, string data)
  • Every media object is a handle borrowed from its channel: valid only while that channel is alive, and never to be used after leaving
  • SMeetingNet.dll is a C++/CLI mixed-mode assembly, so its bitness must match bin and your project’s target platform—see Integration
A fuller runnable example is the WinForms demo (9-grid layout, with device pickers, paging, sharing and chat).