2009-11-22 5 views
0

Est-il possible de créer mscorlib.dll personnalisé sans aucune utilisation de code natif (pinvoke autorisé :-)?mscorlib.dll personnalisé sans code natif

J'ai essayé une petite expérience ce week-end pour voir comment il serait difficile de le faire et avait des problèmes suivants:

  1. J'ai ajouté une classe System.Static à ma version de mscorlib mais avait TypeLoadException avec le message qu'il ne peut pas charger le type 'System.Static`1' de 'mscorlib, Version = 2.0.0.0, Culture = neutre, PublicKeyToken = b77a5c561934e089. Donc, il semble que c'est encore en train de charger la bibliothèque MS. Comment éviter cela (j'utilise déjà le commutateur/nostdlib)?
  2. Quand j'appelé mon mscorlib 'mycorlib J'ai eu des erreurs que System.Object doit avoir une classe parente
  3. Si j'ai type générique T et que je fais new T() il est traduit par C# compilator à Activator.CrateInstance<T>() qui appelle la mise en œuvre MS RuntimeTypeHandle.CreateInstance(...) qui est la méthode native. Puis-je l'appeler depuis mon mscorlib ou est-il inclus dans mscorlib fourni par MS?

Mon but était de tester la possibilité d'écrire mes versions de int, double, string et autres types standards. Je veux utiliser MS CLR, mais fournissez simplement mes classes de code managé.

Est-ce possible?

+0

Hey! Avez-vous enfin trouvé une solution à ce problème? J'essaie actuellement de faire la même chose :) http://lightnet.codeplex.com/ –

+0

@Koistya Navin - Malheureusement, j'ai perdu cette bataille. On dirait que l'écriture propre CLR est le seul moyen :-( – SeeR

+0

@Tarkus Comment avez-vous eu avec cela? Je voudrais avoir un mscorlib dépouillé pour les développeurs plugin pour le code contre – mcintyre321

Répondre

1

Non ce n'est pas possible. Certains types de corelib sont trop liés à l'implémentation MS.Net pour être remplacés par du code managé.

Vous pouvez essayer de cela avec l'exécution mono. Mais même alors, vous constaterez que CERTAINES (quoique très peu) méthodes ne peuvent pas (ou seulement avec un surcoût ÉNORME) être implémentées en code purement managé. Un exemple pour cela serait la classe de chaînes. Alors qu'il peut être principalement implémenté dans les choses gérées (voir mono) comme Intern() ne peut pas être simplement et significativement mis en œuvre géré uniquement. Aussi vous aurez même des problèmes avec les constructeurs dans le cas d'une chaîne (qui est par défaut immuable!).