/// <summary>
        /// Erstellt eine neue Instanz der Klasse.
        /// </summary>
        /// <param name="Player">Der Player, dem die Klasse zugeordnet werden soll. Kann
        /// nicht <see langword="null"/> sein.</param>
        /// <exception cref="System.ArgumentNullException">Wird ausgelöst, wenn <paramref name="Player"/>
        /// <see langword="null"/> ist.</exception>
        public Sync(Player Player)
            : base()
        {
            if (Player == null)
                throw new ArgumentNullException("Player");

            this._player = Player;
            this._sync = (global::Liconcomp.Sync)Activator.CreateInstance(typeof(global::Liconcomp.SyncClass));
        }
        /// <summary>
        /// Erstellt eine neue Instanz des Players. Beachten Sie immer nur eine
        /// Instanz dieser Klasse zur gleichen Zeit zu erstellen. Im DEBUG Modus
        /// wird eine <see cref="System.InvalidOperationException"/> ausgelöst,
        /// sollten Sie versuchen eine zweite Instanz zu erzeugen, bevor die erste
        /// freigegeben wurde.
        /// </summary>
        public Player()
            : base()
        {
            #if DEBUG
            if (Player.INSTANCE != null)
                throw new InvalidOperationException("You should not instantiate the Liconcomp Class more than once!");
            Player.INSTANCE = this;
            #endif

            StartPlayer();
        }
        /// <summary>
        /// Konstruktor, der eine Referenz des Players und das Element übernimmt,
        /// welches gewrappt werden soll.
        /// </summary>
        /// <param name="Player">Eine Referenz auf den <seealso cref="Player"/>.
        /// Darf nicht <see langword="null"/> sein.</param>
        /// <param name="Element">Das COM Objekt, welches von dieser Instanz
        /// kontrolliert werden soll. Muss <see cref="global::Liconcomp.IElement"/>
        /// implementieren und darf nicht <see langword="null"/> sein.</param>
        internal Element(Player Player, global::Liconcomp.IElement Element)
            : base()
        {
            if (Player == null)
                throw new ArgumentNullException("Player");
            if (Element == null)
                throw new ArgumentNullException("Element");
            this._player = Player;
            this._object = Element;

            // Wenn das Objekt schon ein Movement hat, dann übernehmen wir es.
            if (this._object.Movement != null)
                this._position = new Movement((global::Liconcomp.IPosition)this.COMObject.Movement);

            HookEvents();
        }
        /// <summary>
        /// Interne Methode um alle Instanzvariablen freizugeben. Diese Methode sollte von
        /// erbenden Klassen überschrieben werden.
        /// </summary>
        /// <param name="Disposing"><see langword="true"/>, wenn der Aufruf vom Garbage
        /// Collector stammt, sonst <see langword="false"/>.</param>
        protected override void Dispose(bool Disposing)
        {
            // Wir müssen allen erbenden Klassen mitteilen, dass sie ihre Ereignis-
            // handler entfernen sollen. Ansonsten wird Liconcomp die Objekte niemals
            // freigeben.
            UnhookEvents();

            this._object = null;
            this._player.RemoveElement(this);
            this._player = null;

            base.Dispose(Disposing);
        }
        /// <summary>
        /// Interne Methode um alle Instanzvariablen freizugeben. Diese Methode sollte von
        /// erbenden Klassen überschrieben werden.
        /// </summary>
        /// <param name="Disposing"><see langword="true"/>, wenn der Aufruf vom Garbage
        /// Collector stammt, sonst <see langword="false"/>.</param>
        protected override void Dispose(bool Disposing)
        {
            base.Dispose(Disposing);

            while (this._elements.Count > 0)
                this._elements[0].Dispose();

            StopPlayer();

            this._elements.Clear();
            this._elements = null;

            #if DEBUG
            Player.INSTANCE = null;
            #endif
        }
        /// <summary>
        /// Interne Methode um alle Instanzvariablen freizugeben. Diese Methode sollte von
        /// erbenden Klassen überschrieben werden.
        /// </summary>
        /// <param name="Disposing"><see langword="true"/>, wenn der Aufruf vom Garbage
        /// Collector stammt, sonst <see langword="false"/>.</param>
        protected override void Dispose(bool Disposing)
        {
            base.Dispose(Disposing);

            this._sync = null;
            this._player = null;
        }
 /// <summary>
 /// Standardkonstruktor.
 /// </summary>
 /// <param name="Player">Eine Referenz auf das <see cref="Player"/> Objekt.</param>
 /// <param name="VideoFile">Das COM Objekt, welches gewrappt werden soll.</param>
 internal VideoFile(Player Player, global::Liconcomp.IVideoFile VideoFile)
     : base(Player, VideoFile)
 {
 }
 /// <summary>
 /// Privat. Es sollte die <see cref="Instance"/> Eigenschaft genutzt werden
 /// um eine Instanz dieser Klasse zu erzeugen.
 /// </summary>
 private Context()
 {
     this._player = new Player();
 }
        /// <summary>
        /// Gibt diese Instanz frei. Der Kontext kann danach nicht mehr benutzt werden.
        /// </summary>
        /// <param name="disposing">Gibt an, ob die Methode vom Garbage Collector aufgerufen
        /// wird oder nicht.</param>
        protected virtual void Dispose(bool disposing)
        {
            this.DestroySync();
            this._playlists.Clear();
            this._playlists = null;

            if (this._player != null)
            {
                this._player.Dispose();
                this._player = null;
            }
        }