Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么反射搜索突然什么也找不到?_C#_Reflection_Mime Types - Fatal编程技术网

C# 为什么反射搜索突然什么也找不到?

C# 为什么反射搜索突然什么也找不到?,c#,reflection,mime-types,C#,Reflection,Mime Types,根据这个问题和答案,我有以下代码 它工作得非常好: static MimeMappingWrapper() { // dirty trick - Assembly.LoadWIthPartialName has been deprecated //Assembly ass = Assembly.LoadWithPartialName("System.Web"); Assembly ass = Assembly.Get

根据这个问题和答案,我有以下代码 它工作得非常好:

    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下进行了检查,该方法仍然存在。这是它的签名:

// 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);
更新:好消息是该类及其方法似乎可能会在.NET4.5中公开

但是,这意味着您的代码肯定会被破坏,因为您只搜索
非公开的方法。尝试执行全包搜索,查看是否显示
GetMimeMapping

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

我自己也遇到了这个问题,可以提供一些额外的背景:

Microsoft对DLL进行demi升级(例如将MimeMapping从“内部”更改为“公共”)。我们的计划是,这些更改将完全应用到框架的下一个版本中

在.NET 4.0以后的版本中,为了防止开发人员在较新的系统上使用这些修改(他们可能不知道这些修改会在未修补的计算机上中断),IDE使用“引用程序集”文件夹(而不是GAC中的运行时程序集)中的代码签名快照,这些快照在主要版本之间不会更改

这意味着,尽管运行时类型是公共的,您的IDE只能看到内部版本,因此您仍然无法在没有反射的情况下使用它


您的代码只需更改为同时使用公共和非公共绑定标志进行检查,以适应使用的版本。在该框架的下一个版本中,您可能只需要使用该类型而无需进行反射。

好吧,如果它以前工作,现在也不工作,那么可能有些内容已被更改。它与我的本地工作站有关,因为我刚刚试用过,它在web服务器上工作。请尝试执行上面的两个片段,告诉我们
版本
的结果是什么,以及
方法
中返回的方法的名称。我接受这个答案,因为这是唯一合乎逻辑的解释,我的工作站的.NET Framework一定发生了什么事情,它不再工作了。运行时版本是4.0.30319,返回的方法只有一个,{Void SetIntegratedApplicationContext(IntPtr)}当使用扩展的绑定标志列表时,GetMethods()调用确实找到了该方法