根据该问题,我有以下代码&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);