Почему поиск Reflection вдруг не нашел ничего? - PullRequest
3 голосов
/ 05 февраля 2012

У меня был следующий код согласно этому вопросу и ответу Как получить MIME-тип файла, запрашиваемого в 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.

В чем может быть причина? Ничего особенного не изменилось в приложении, и даже если бы это было так, как это могло повлиять на этот конструктор для класса-оболочки?

Ответы [ 2 ]

5 голосов
/ 05 февраля 2012

Полагаю, что .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);

Обновление : Хорошая новость заключается в том, что класс MimeMapping и его метод GetMimeMapping кажутся открытыми в .NET 4.5 ,

Однако это означает, что ваш код обязательно сломается, так как вы ищете только методы NonPublic. Попробуйте вместо этого выполнить поиск по принципу «все включено» и посмотрите, отображается ли GetMimeMapping:

var methods = mimeMappingType.GetMethods(
    BindingFlags.Instance | 
    BindingFlags.Static | 
    BindingFlags.Public |
    BindingFlags.NonPublic | 
    BindingFlags.FlattenHierarchy);
0 голосов
/ 23 марта 2013

Просто столкнулся с этим сам и могу дать немного дополнительного контекста:

Microsoft выполняет деми-апгрейды до dll (например, изменяя MimeMapping с «внутреннего» на «общедоступный»). Планируется, что эти изменения полностью войдут в следующую версию фреймворка.

В .NET 4.0 и более поздних версиях, чтобы разработчики не могли использовать эти модификации в более новых системах (которые могут не знать, что они будут работать на непатчированных компьютерах), среда IDE использует моментальный снимок подписей кода в папке «Reference Assemblies» (не исполняемые из GAC), которые не меняются между основными версиями.

Это означает, что, несмотря на то, что тип среды выполнения является общедоступным, ваша IDE может видеть только внутреннюю версию, поэтому вы все равно не сможете использовать ее без отражения.

Ваш код должен изменяться только для проверки как с публичными, так и с непубличными флагами привязки, чтобы учитывать, какая версия используется. В следующей версии фреймворка вы, вероятно, просто сможете использовать тип без отражения.

...