从.NET可执行文件加载类型

时间:2009-05-03 03:19:58

标签: .net reflection

从可编译的.NET程序集(.exe)动态加载类型与从编译成.dll的.NET程序集加载类型相比,是否存在任何影响?

如果它是.NET可执行文件或.exe,测试.exe和.dll的最佳和最快方法是什么? 不是(只是不是BadImageFormatException的忠实粉丝)?

谢谢。

2 个答案:

答案 0 :(得分:6)

EXE和DLL文件在Windows中差别不大,在.NET中则更少。这基本上只是入口点和其他一些细节的问题。 (.NET DLL确实有一个入口点,但是你没有实现它。在本机代码中它被称为DllMain。)

至于测试它是否是.NET程序集,我建议只是尝试加载它以仅反射并捕获异常。但如果你真的想要避免这种情况,请查看this blog entry

答案 1 :(得分:2)

使用exe来托管类型有一个重要的考虑因素...... VS2005不太支持它。编译器(csc),运行时等都没有看到任何实际问题 - 只是IDE对添加对exe文件的引用不是很满意。

这已在VS2008中修复,但如果您需要支持VS2005开发人员,我建议您使用dll作为参考。

在装配级别,没有太大差异。

用于区分两者(exe / dll) - 检查装配体上的入口点:

using System;
using System.Reflection;
using System.Net;

class Program {
    static void Main() {
        IsItAnExe(typeof(Program).Assembly); // this one ;-p
        IsItAnExe(typeof(string).Assembly); // mscorlib
        IsItAnExe(typeof(WebClient).Assembly); // System
    }
    static void IsItAnExe(Assembly assembly) {
        MethodInfo entryPoint = assembly.EntryPoint;
        Console.WriteLine(assembly.GetName().Name + ": " +
            (entryPoint == null ? "no entry-point" :
            (entryPoint.DeclaringType.FullName + "." + entryPoint.Name)));
    }
}