2009-02-12 7 views
0

Pourquoi assembly.GetExportedTypes() affiche un résultat différent en C# et VB.NET?assembly.GetExportedTypes() affiche un résultat différent

Ces deux donnent des résultats différents

var v = from a in AppDomain.CurrentDomain.GetAssemblies() from b in a.GetExportedTypes() select b; 
v.Count(); 

Dim v = From a In AppDomain.CurrentDomain.GetAssemblies(), b In a.GetExportedTypes()  Select b v.Count() 
+0

Qu'entendez-vous par "différent"? Vous réfléchissez à la même assemblée? –

+0

Veuillez donner un exemple complet de ce que vous voulez dire. –

+0

Par exemple: Ces deux donnent des résultats différents C# - var v = de a dans AppDomain.CurrentDomain.GetAssemblies() de b dans a.GetExportedTypes() select b; v.Count(); VB.nET - Dim v = D'un dans AppDomain.CurrentDomain.GetAssemblies(), b Dans a.GetExportedTypes() Sélectionnez b v.Count() –

Répondre

1

Lorsque vous compilez un ensemble VB.NET, il comprend certains types « d'aide » supplémentaires. Utilisez Reflector pour voir votre assembly compilé pour voir ce que je veux dire.

Je suis sûr que vous trouverez que le seul assemblage avec des différences est celui que vous utilisez pour faire la réflexion - c.-à-d. Celui qui est construit avec C# ou VB.NET, en fonction de votre scénario.

EDIT: Cela dépend exactement de la façon dont vous définissez vos classes.

Cependant, encore une fois c'est seulement pertinentes du code en cours de compilation par le compilateur C# ou VB. Lorsque vous appelez GetExportedTypes, peu importe la langue d'où vous appelez. Vous êtes confus par le fait que vous n'écrivez que le nombre total. Voici deux programmes courts mais complets pour montrer la différence:

C#

using System; 
using System.Reflection; 

public class ShowTypeCounts 
{ 
    static void Main() 
    { 
     AppDomain domain = AppDomain.CurrentDomain; 
     foreach (Assembly assembly in domain.GetAssemblies()) 
     { 
      Console.WriteLine("{0}: {1}", 
           assembly.GetName().Name, 
           assembly.GetExportedTypes().Length); 
     } 
    } 
} 

Résultats:

mscorlib: 1282 
ShowTypeCounts: 1 

VB

Imports System 
Imports System.Reflection 

Public Module ShowCounts 

    Sub Main() 
     Dim domain As AppDomain = AppDomain.CurrentDomain 

     For Each assembly As Assembly in domain.GetAssemblies 

      Console.WriteLine("{0}: {1}", _ 
           assembly.GetName.Name, _ 
           assembly.GetExportedTypes.Length) 

     Next 
    End Sub 

End Module 

Résultats:

mscorlib: 1282 
ShowTypeCounts: 1 

Comme vous pouvez le voir, les résultats sont les mêmes - mais si vous supprimez « public » soit de morceau de code, les ShowTypeCounts résultat va à 0. Ce n'est pas une différence de la façon dont fonctionne GetExportedTypes entre les langues - Cela dépend uniquement des types que vous exportez réellement. Je suppose que dans vos applications de console, l'un avait un type public et l'autre pas.

+0

Mais jon skeet je n'utilise qu'une simple application de console créée en vs 2008 .. dans le main() j'ai tapé ceci et obtenu des résultats différents pour C# et vb. Je n'utilise pas mon propre assemblage personnalisé. Il suffit de créer deux applications console en C# et vb.net dans la même solution et utilisez le code que j'ai tapé plus tôt. Merci. –

+0

Oui, l'un des assemblages reflétés dans * est * cette application de console. –

+0

Excellente explication. Merci gourou! –

Questions connexes