根据该问题,我有以下代码&answer How do I get the MIME type of a file being requested in ASP.NET C#?
并且工作得很好:

    static MimeMappingWrapper()
    {
        // dirty trick - Assembly.LoadWIthPartialName has been deprecated
        //Assembly ass = Assembly.LoadWithPartialName("System.Web");
        Assembly ass = Assembly.GetAssembly(typeof (HttpApplication));
        Type mimeMappingType = ass.GetType("System.Web.MimeMapping");

        GetMimeMappingMethod = mimeMappingType.GetMethod("GetMimeMapping", BindingFlags.Static | BindingFlags.NonPublic);
    }


现在突然mimeMappingType.GetMethod("GetMimeMapping", BindingFlags.Static | BindingFlags.NonPublic)返回null

可能是什么原因?在应用程序中没有什么特别的更改,即使已更改,它如何影响包装类的此构造函数?

最佳答案

我的猜测是服务器上安装的.NET Framework已升级,并且新版本下不再存在私有构造函数。

程序集开发人员(在这种情况下为Microsoft)可以随意更改任何私有(或内部)类型或成员,而不必认为这是一个重大更改。

编辑:我在.NET 4.0下在我的PC上进行了检查,但该方法仍然存在。这是它的签名:

// System.Web.MimeMapping
internal static string GetMimeMapping(string FileName)


在这一点上,我的两个建议是在运行时检查您的实际.NET版本。

var version = System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion();


…并枚举MimeMapping类的方法以检查它们是否符合您的期望:

var methods = mimeMappingType.GetMethods(BindingFlags.Static | BindingFlags.NonPublic);


更新:好消息是,MimeMapping类及其GetMimeMapping方法似乎可以在.NET 4.5中公开。

但是,这意味着您的代码肯定会中断,因为您只在搜索NonPublic方法。尝试执行全包搜索,然后查看是否显示GetMimeMapping

var methods = mimeMappingType.GetMethods(
    BindingFlags.Instance |
    BindingFlags.Static |
    BindingFlags.Public |
    BindingFlags.NonPublic |
    BindingFlags.FlattenHierarchy);

10-01 17:53
查看更多