Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#] The type initializer for 'MyClass' threw an exception

Pagina: 1
Acties:

  • Marc.O
  • Registratie: Maart 2013
  • Laatst online: 03-03-2024
Hallo Tweakers,

Ik loop tegen een exception aan die ik niet op kan lossen.
Ik krijg de exception bij het aanroepen van de constructor van een control.
De control heeft 2 constructors.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//call
ControlA ctrl = new ControlA(strS, intI, boolB);

public partial class ControlA : UserControl
{
  public ControlA()
  {
    InitializeComponent();          
  }

  public ControlA(string str, int i, Boolean b) 
  {
    this.str = str;
    this.i = i;
    this.b = b;

    InitializeComponent();
    headerFont = new Font("Courier New", headerTextSize, FontStyle.Regular);
  }
}


Dit geeft de volgende exception:
"The type initializer for 'ControlA' threw an exception"

Met de InnerException:
"Value cannot be null.\r\nParameter name: method"

Ik heb een breakpoint op de aanroep van de constructor gezet en op beide constructors. Als ik een step maak van de aanroep krijg ik de exception. Ik kom nooit in de preakpoints van een van de constructors.

De debug folder bevat alle relevante bestanden en de cpu properties van alle projecten staan op "any cpu" (dit zou volgens google het probleem op kunnen lossen).

Heeft iemand een idee waar het probleem ligt of waar ik het moet zoeken?

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 20:09

Cyphax

Moderator LNX
Kom je niet in de knoei met System.Web.UI.Control nou? Welke Control heb je daar precies bij "new Control(...)"?
Je hebt vast using System.Web.UI bovenin staan, raakt ie niet gewoon in de war nu?

Saved by the buoyancy of citrus


  • Cor453
  • Registratie: Mei 2011
  • Laatst online: 30-10 14:42
Ik denk dat Cyphax gelijk heeft: als je de naam Control nu eens verandert in iets wat specifieker is en minder conflicten gaat geven? Werkt het dan?

  • Marc.O
  • Registratie: Maart 2013
  • Laatst online: 03-03-2024
Het is een custom control in een windows forms application.

Edit: Sorry had ik erbij moeten zeggen. Control is niet de naam die ik gebruik maar gewoon hier even een voorbeeld.

[ Voor 50% gewijzigd door Marc.O op 23-09-2013 17:03 ]


  • Cyphax
  • Registratie: November 2000
  • Laatst online: 20:09

Cyphax

Moderator LNX
Oh een Windows Forms applicatie... hmmm. Ik kan het niet uit deze code halen. Het kon weleens misgaan bij InitializeComponent(), die leest weer een YAML-bestandje uit, maar daar post je verder niets van dus da's gokken.

Kijk eens op http://stackoverflow.com/...-and-how-does-it-work-wpf of je hier niet een aanknopingspunt vindt. :)

Saved by the buoyancy of citrus


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat is een post over WPF, hij zegt nou juist dat het om WinForms gaat :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Waarschijnlijk heb je een static constructor of het gaat fout bij de initialisatie van een van de static fields van de class ( Die roepen misschien weer een andere Constructur aan ).

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Ergens in een static field of static constructor laad je waarschijnlijk wat xml in waarbij het veld "method" ontbreekt. Waar dit precies gebeurd blijkt niet uit je geposte code (want daar is niets static).

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • STW
  • Registratie: Mei 2002
  • Laatst online: 21-11 19:11

STW

Moridin

Ik zou vanuit het omschrijven naar:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//call
ControlA ctrl = new ControlA(strS, intI, boolB);

public partial class ControlA : UserControl
{
  public ControlA()
  {
    InitializeComponent();          
  }

  public ControlA(string str, int i, Boolean b)
    :this() 
  {
    this.str = str;
    this.i = i;
    this.b = b;

    headerFont = new Font("Courier New", headerTextSize, FontStyle.Regular);
  }
}


Vanuit je tweede constructor als eerste de default constructor aanroepen. Volgens mij zou dat je probleem moeten oplossen.

[ Voor 0% gewijzigd door STW op 23-09-2013 20:58 . Reden: layout aanpassing ]

It is amazing what you can accomplish if you do not care who gets the credit.


  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10 08:18
pedorus schreef op maandag 23 september 2013 @ 18:42:
Ergens in een static field of static constructor laad je waarschijnlijk wat xml in waarbij het veld "method" ontbreekt. Waar dit precies gebeurd blijkt niet uit je geposte code (want daar is niets static).
sinds wanneer leest winforms xml in?


@TS:
Wat STW hierboven doet is (op een nette manier) zorgen dat je initialize components methode (zie je andere partial class blabla.designer.cs) als eerste wordt uitgevoerd.

In je voorbeeld is dit niet zo, dit is wel een best practise.


Ik zit me af te vragen of jou voorbeeld echt fout gaat.
Dat wat je in de topic-start hebt gepost gaat namelijk niet mis. Wellicht is het wat om een kleine testcase te bouwen die wel fout gaat


ow en nog een puntje (we zijn toch aan't mierenneuken):
gebruik je basic types of niet? volgens mij is het aan te raden om het wel te doen. Dus schrijf dan ook 'bool' en niet 'Boolean'

[ Voor 46% gewijzigd door BasieP op 23-09-2013 22:04 ]

This message was sent on 100% recyclable electrons.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 13:12
Anders check even de code in de ControlA designer file.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Marc.O
  • Registratie: Maart 2013
  • Laatst online: 03-03-2024
@STW:
Ik heb het aangepast maar het helpt niet.

Het lijkt tussen de call en de uitvoering van de constructor fout te gaan. Zoals ik al zei heb ik een breakpoint op de call en de eerste regel van de constructor. Hij breakt wel op de call naar de constructor maar komt nooit in de breakpoint in de constructor.

Het rare is dat het in vorige releases altijd gewerkt heeft en dat er na mijn idee aan de code niks verandert is. Kan het misschien komen door verkeerde project instellingen?

  • PdeBie
  • Registratie: Juni 2004
  • Laatst online: 16:21
Ik zal dan eerst maar eens kijken of het ook echt zo is dat er niets gewijzigd is. Soms valt er op punt A iets om, door een wijziging op punt B.

  • JMaster
  • Registratie: December 2009
  • Laatst online: 19-11 10:23
Je hebt niet toevalligerwijs ergens een reference van ControlA naar je class die de call aanroept?

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Marc.O schreef op dinsdag 24 september 2013 @ 10:23:
@STW:
Ik heb het aangepast maar het helpt niet.

Het lijkt tussen de call en de uitvoering van de constructor fout te gaan. Zoals ik al zei heb ik een breakpoint op de call en de eerste regel van de constructor. Hij breakt wel op de call naar de constructor maar komt nooit in de breakpoint in de constructor.

Het rare is dat het in vorige releases altijd gewerkt heeft en dat er na mijn idee aan de code niks verandert is. Kan het misschien komen door verkeerde project instellingen?
Zoals ik reeds hierboven aangaf gaat het fout bij het initialiseren van het Type, en dus waarschijnlijk een Static Constructor/Field. Op het punt waar je de constructor call maakt zal de eerste keer namelijk eerst het type geïnitialiseerd worden, maar dat gaat mis en dus kom je niet in de daadwerkelijke constructor. Maar ook met de exception die je hebt kun je natuurlijk gewoon de stacktrace kijken, en dus zo achterhalen op welke regel het mis gaat.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Marc.O
  • Registratie: Maart 2013
  • Laatst online: 03-03-2024
Woy je hebt helemaal gelijk. Het gaat mis op de volgende regel:
C#:
1
2
3
static MemCpyImpl memcpyimpl = (MemCpyImpl)Delegate.CreateDelegate(typeof(MemCpyImpl), typeof(Buffer).GetMethod("memcpyimpl", BindingFlags.Static | BindingFlags.NonPublic)); // throws exception.

private unsafe delegate void MemCpyImpl(byte* src, byte* dest, int len);


Blijkbaar kan hij "memcpyimpl" niet meer vinden? Hier is niks aan verandert tenopzichte van vorige wel werkende versies...

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Marc.O schreef op dinsdag 24 september 2013 @ 11:38:
Blijkbaar kan hij "memcpyimpl" niet meer vinden?
Als je de daadwerkelijke exception ( InnerException ) dan bekijkt weet je echt wat er mis gaat.
Hier is niks aan verandert tenopzichte van vorige wel werkende versies...
Jij denkt dat er niks is veranderd, maar het resultaat toont aan dat er wel wat veranderd is ;)

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Marc.O
  • Registratie: Maart 2013
  • Laatst online: 03-03-2024
Woy schreef op dinsdag 24 september 2013 @ 11:41:
Jij denkt dat er niks is veranderd, maar het resultaat toont aan dat er wel wat veranderd is ;)
Scherp ;)

"methode" -> typeof(Buffer).GetMethod("memcpyimpl", BindingFlags.Static | BindingFlags.NonPublic) geeft inderdaad null terug wat in de inner exception staat. Rest alleen de vraag nog waarom...

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Sowieso zie ik daar een probleem met de case, en je hebt natuurlijk altijd risico met het gebruiken van dergelijke non-public methodes. Die kunnen immers bij een update zomaar verdwijnen. Heb je bijvoorbeeld een update geïnstalleerd, of ben je overgestapt op een andere versie van het framework.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • PdeBie
  • Registratie: Juni 2004
  • Laatst online: 16:21
pdebie schreef op dinsdag 24 september 2013 @ 10:44:
Ik zal dan eerst maar eens kijken of het ook echt zo is dat er niets gewijzigd is. Soms valt er op punt A iets om, door een wijziging op punt B.
I repeat myself..... :+

  • Marc.O
  • Registratie: Maart 2013
  • Laatst online: 03-03-2024
Ik heb geen update gehad. En volgens de diff is er niks verandert in het project waar het in fout gaat.

Maar goed ik zag in http://stackoverflow.com/...ay-of-copying-arrays-in-c dat ik kan proberen of het met een blockCopy nog snel genoeg gaat.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Waarom gebruik je Buffer.BlockCopy überhaupt niet? Een dergelijke non-public functie is bijna nooit te verkiezen boven de normaal beschikbare API!

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Marc.O
  • Registratie: Maart 2013
  • Laatst online: 03-03-2024
Tja dat is een goede vraag. Ik heb dit deel van het project niet zelf gemaakt maar ik denk dat het gedaan is omdat het een betere prestatie zou moeten leveren.

Ik ga het nu omschrijven naar de blockCopy. Bedankt voor alle hulp!

[ Voor 18% gewijzigd door Marc.O op 24-09-2013 13:04 ]


  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10 08:18
leuk man.. c++ mannetjes die in managed code niet weten hoe iets moet en maar ranzige code schrijven zonder dit (blijkbaar) te documenteren

This message was sent on 100% recyclable electrons.

Pagina: 1