assembly.GetExportedTypes()显示不同的结果

时间:2009-02-12 08:06:12

标签: c# vb.net

为什么assembly.GetExportedTypes()在C#和VB.NET中显示不同的结果?

这两个给出不同的结果

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() 

1 个答案:

答案 0 :(得分:1)

编译VB.NET程序集时,它包含一些额外的“帮助程序”类型。使用Reflector查看已编译的程序集,看看我的意思。

我很确定你会发现唯一有差异的程序集就是你用来做反射的程序集 - 即用C#或VB.NET构建的程序集,具体取决于你的场景

编辑:这取决于你如何定义你的类。

但是,这只是与C#或VB编译器编译的代码相关。当您致电GetExportedTypes时,您拨打的语言无关紧要。你只是在写出总数,这让你感到困惑。以下是两个简短但完整的程序,以显示差异:

<强> 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);
        }
    }
}

结果:

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

结果:

mscorlib: 1282
ShowTypeCounts: 1

正如您所看到的,结果是相同的 - 但如果您从任一代码中删除“public”,ShowTypeCounts结果将下降到0.这不是GetExportedTypes在语言之间如何工作的区别 - 它只是取决于您实际导出的类型。

我的猜测是,在你的控制台应用中,一个有公共类型而另一个没有。