[C#] Override niet valide

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Shapeshifter
  • Registratie: Januari 2004
  • Laatst online: 02-10 14:23

Shapeshifter

Get it over with

Topicstarter
Ik probeer mijn Windows Media Center plugin zover te krijgen dat hij registreert wanneer ik iets afspeel. In de documentatie staat dat daar een event voor geraised wordt.

Het probleem is dat wanneer ik probeer te overriden ik een compile error krijg: OmniAAddIn.cs(21,74): error CS0106: The modifier 'override' is not valid for this item, maar als ik het weglaat krijg ik een "System.NullReferenceException: Object reference not set to an instance of an object" als ik probeer te subscriben naar het event.

Staar me er een beetje blind op...

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class OmniAAddIn : IAddInEntryPoint, IAddInModule
{
    public void Initialize(Dictionary<string, object> appInfo, Dictionary<string, object> entryPointInfo){}

    public override Microsoft.MediaCenter.UI.PropertyChangedEventHandler PropertyChanged;

    public void PlayRateChanged(Microsoft.MediaCenter.UI.IPropertyObject sender, string property)
    {
        if (property == "PlayRate")
        {
            //dostuff
        }
    }

    public void Launch(AddInHost host)
    {
        Socket socket;
        SerialPort port;
        MySqlConnection dbconnection;
        MySqlCommand dbcommand;
        byte[] hexbytes;
        
        try
        {
            host.MediaCenterEnvironment.MediaExperience.Transport.PropertyChanged += new Microsoft.MediaCenter.UI.PropertyChangedEventHandler(PlayRateChanged);
        }
        catch (Exception e)
        {
            host.MediaCenterEnvironment.Dialog(e.ToString(), "OmniA", Microsoft.MediaCenter.DialogButtons.Ok, 5, false);
        }
    }
}

HP ZBook Studio G3 - Hyundai Ioniq EV Classic - Opel Vivaro-e 75kWh - 22x Prusa i3 MK3S - 8x Prusa MINI+ - Ooznest Workbee 1,5m x 1,5m


Acties:
  • 0 Henk 'm!

  • boe2
  • Registratie: November 2002
  • Niet online

boe2

'-')/

Omdat PropertyChanged helemaal niet bestaat op beide interfaces waarvan je erft? Je geeft ook geen event keyword mee, wat je volgens mij wel wil doen.

Moet er niet gewoon 'event' ipv 'override' staan :?

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind.' - Pratchett.


Acties:
  • 0 Henk 'm!

  • Shapeshifter
  • Registratie: Januari 2004
  • Laatst online: 02-10 14:23

Shapeshifter

Get it over with

Topicstarter
boe2 schreef op dinsdag 04 augustus 2015 @ 12:04:
Omdat PropertyChanged helemaal niet bestaat op beide interfaces waarvan je erft? Je geeft ook geen event keyword mee, wat je volgens mij wel wil doen.

Moet er niet gewoon 'event' ipv 'override' staan :?
Hier en hier staat vergelijkbare code en daar wordt de interface op eenzelfde manier aangeroepen naar mijn idee.

Als ik er gewoon event van maak dan heb ik een mooie variabele die nergens voor gebruikt wordt :P

BTW, C# is niet mijn strong suit, ben meer gewend aan Python, dus sommige concepten binnen C# zijn me niet altijd duidelijk...

[ Voor 8% gewijzigd door Shapeshifter op 04-08-2015 12:36 ]

HP ZBook Studio G3 - Hyundai Ioniq EV Classic - Opel Vivaro-e 75kWh - 22x Prusa i3 MK3S - 8x Prusa MINI+ - Ooznest Workbee 1,5m x 1,5m


Acties:
  • 0 Henk 'm!

  • The_Ghost16
  • Registratie: Januari 2004
  • Laatst online: 19-05 10:05
Het probleem wat je hebt is dat er een PropertyChanged event ergens geraised wordt (zie niet waar) en hier is geen event handler aan gekoppeld. Dus op het moment dat je dat event raised krijg je een null reference exception.

Ik zie ook in de code voorbeelden die je stuurt nergens een override.

In het eerste voorbeeld is er een transport layer die het PropertyChanged event afvangt van MediaExperience.Transport en die vuurt dan zijn eigen PropertyChanged event af indien daar een handler aan gebind is. (Zie de code in de TransportProxy)

Dus om er voor te zorgen dat er iets gebeurd om een PropertyChanged event zul je hier een handler aan moeten binden.

Acties:
  • 0 Henk 'm!

  • Shapeshifter
  • Registratie: Januari 2004
  • Laatst online: 02-10 14:23

Shapeshifter

Get it over with

Topicstarter
The_Ghost16 schreef op dinsdag 04 augustus 2015 @ 12:45:
Het probleem wat je hebt is dat er een PropertyChanged event ergens geraised wordt (zie niet waar) en hier is geen event handler aan gekoppeld. Dus op het moment dat je dat event raised krijg je een null reference exception.

Ik zie ook in de code voorbeelden die je stuurt nergens een override.

In het eerste voorbeeld is er een transport layer die het PropertyChanged event afvangt van MediaExperience.Transport en die vuurt dan zijn eigen PropertyChanged event af indien daar een handler aan gebind is. (Zie de code in de TransportProxy)

Dus om er voor te zorgen dat er iets gebeurd om een PropertyChanged event zul je hier een handler aan moeten binden.
Ik heb aangenomen dat Windows Media Center die events zelf ergens raised en dat je ze zelf kunt afvangen. Ik dacht dat mijn PlayRateChanged functie de events af zou handelen door de koppeling op regel 25, maar een handler specificeren als hieronder geeft nog steeds null exceptions.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class OmniAAddIn : IAddInEntryPoint, IAddInModule
{
    public void Initialize(Dictionary<string, object> appInfo, Dictionary<string, object> entryPointInfo){}

    public Microsoft.MediaCenter.UI.PropertyChangedEventHandler eventHandler;

    public void PlayRateChanged(Microsoft.MediaCenter.UI.IPropertyObject sender, string property)
    {
        if (property == "PlayRate")
        {
            //dostuff
        }
    }

    public void Launch(AddInHost host)
    {
        Socket socket;
        SerialPort port;
        MySqlConnection dbconnection;
        MySqlCommand dbcommand;
        byte[] hexbytes;
        
        try
        {
            eventHandler = new Microsoft.MediaCenter.UI.PropertyChangedEventHandler(PlayRateChanged);
            host.MediaCenterEnvironment.MediaExperience.Transport.PropertyChanged += eventHandler;
        }
        catch (Exception e)
        {
            host.MediaCenterEnvironment.Dialog(e.ToString(), "OmniA", Microsoft.MediaCenter.DialogButtons.Ok, 5, false);
        }
    }
}

[ Voor 40% gewijzigd door Shapeshifter op 04-08-2015 13:08 ]

HP ZBook Studio G3 - Hyundai Ioniq EV Classic - Opel Vivaro-e 75kWh - 22x Prusa i3 MK3S - 8x Prusa MINI+ - Ooznest Workbee 1,5m x 1,5m


Acties:
  • 0 Henk 'm!

  • alwinuzz
  • Registratie: April 2008
  • Laatst online: 22:04
Overriden doe je alleen in een sublass. Dat doe je hier niet, je implementeert 2 interfaces. De syntax met de : is gelijk, misschien vandaar de verwarring.
De code om te attachen aan het event lijkt me goed (meestal is eventHandler geen field maar een variabele in je functie, zou niet uit moeten maken).

Verder krijg je een null exception, maar welk object is null? Op welke regel?
En op regel 26 kunnen 5 dingen null zijn, waar je dan een exception op krijgt op die regel.
NB de echte koppeling doe je pas op regel 26 met +=

Ik weet niet of je kan debuggen met Windows Media Center spul?

[ Voor 4% gewijzigd door alwinuzz op 04-08-2015 14:13 ]


Acties:
  • 0 Henk 'm!

  • Shapeshifter
  • Registratie: Januari 2004
  • Laatst online: 02-10 14:23

Shapeshifter

Get it over with

Topicstarter
alwinuzz schreef op dinsdag 04 augustus 2015 @ 14:13:
Overriden doe je alleen in een sublass. Dat doe je hier niet, je implementeert 2 interfaces. De syntax met de : is gelijk, misschien vandaar de verwarring.
De code om te attachen aan het event lijkt me goed (meestal is eventHandler geen field maar een variabele in je functie, zou niet uit moeten maken).

Verder krijg je een null exception, maar welk object is null? Op welke regel?
En op regel 26 kunnen 5 dingen null zijn, waar je dan een exception op krijgt op die regel.
NB de echte koppeling doe je pas op regel 26 met +=

Ik weet niet of je kan debuggen met Windows Media Center spul?
Ik zou al heel blij zijn als ik het geïmplementeerd kreeg :P

Deze regel gooit de null exception:

host.MediaCenterEnvironment.MediaExperience.Transport.PropertyChanged += eventHandler;

Debuggen is inderdaad vrij lastig, tot dusverre kwam ik er meestal wel uit door de exceptie te vangen en in een dialog te gooien, dan geeft hij het weer op de televisie.

HP ZBook Studio G3 - Hyundai Ioniq EV Classic - Opel Vivaro-e 75kWh - 22x Prusa i3 MK3S - 8x Prusa MINI+ - Ooznest Workbee 1,5m x 1,5m


Acties:
  • 0 Henk 'm!

  • alwinuzz
  • Registratie: April 2008
  • Laatst online: 22:04
OK als je niet kan debuggen, kan je altijd nog dit doen

C#:
1
2
3
4
if (host == null) throw new InvalidOperationException("host == null");
if (host.MediaCenterEnvironment == null) throw new InvalidOperationException("host.MediaCenterEnvironment  == null");
if (host.MediaCenterEnvironment.MediaExperience == null) throw new InvalidOperationException("host.MediaCenterEnvironment.MediaExperience == null");
// en zo het rijtje af

stap 1 is uitzoeken wat null is
stap 2 is dan uitzoeken waarom dat null is
Het zou best kunnen dat Transport null is, want dat wordt ook gecontroleerd bij de code die je eerder linkte.

Acties:
  • 0 Henk 'm!

Verwijderd

Het is ook logisch dat de override niet werkt omdat je de eigenaar van deze event (MediaTransport) zou moeten erven hiervoor.

Of je zou in je eigen klasse een prive variabele moeten aanmaken hiervoor, zodat je hier verder mee kan werken en de eventuele events hierdoor bloot legt.

Als je een voorbeeld wenst laat het dan even weten, ik type dit nu vanaf de telefoon en code typen word zo een hele klus. :P

Acties:
  • 0 Henk 'm!

  • Shapeshifter
  • Registratie: Januari 2004
  • Laatst online: 02-10 14:23

Shapeshifter

Get it over with

Topicstarter
Even zien, host is geen null, host.MediaCenterEnvironment ook niet, maar host.MediaCenterEnvironment.MediaExperience is wel null. Als ik host.MediaCenterEnvironment.MediaExperience.Transport probeer te testen crasht hij gewoon zonder enige elegantie :P

Wat welk gek is, is dat ik verderop in de plugin gewoon dit kan gebruiken om te pauzeren:

host.MediaCenterEnvironment.MediaExperience.Transport.PlayRate = 1;

Dus daar kan ik hem opeens wel aanroepen...

Edit:
Ik vond een cruciaal zinnetje ergens:
AddInHost.MediaCenterEnvironment and AddInHost.MediaExperience may return null if media is not currently playing.
En zowaar, de app crasht ook als je Media Center opstart en probeert te pauzeren oid, dat was me nog nooit eerder opgevallen. Nu nog een trucje verzinnen om de handler eraan vast te knopen ook al is hij null...

[ Voor 29% gewijzigd door Shapeshifter op 06-08-2015 04:55 ]

HP ZBook Studio G3 - Hyundai Ioniq EV Classic - Opel Vivaro-e 75kWh - 22x Prusa i3 MK3S - 8x Prusa MINI+ - Ooznest Workbee 1,5m x 1,5m

Pagina: 1