Получение версии сборки Silverlight во время выполнения

Я хочу показать номер версии моего приложения Silverlight 3 в поле «О программе», но когда я использую традиционный вызов .Net, например:

Assembly.GetExecutingAssembly().GetName().Version;

Я получаю исключение MethodAccessException при вызове GetName(). Как я должен получить номер версии моей сборки?


person Dov    schedule 19.02.2010    source источник


Ответы (3)


private static Version ParseVersionNumber(Assembly assembly)
{
    AssemblyName assemblyName = new AssemblyName(assembly.FullName);
    return assemblyName.Version;
}

или это:

Assembly assembly = Assembly.GetExecutingAssembly(); 
String version = assembly.FullName.Split(',')[1];
String fullversion = version.Split('=')[1]; 

От: http://betaforums.silverlight.net/forums/p/128861/288595.aspx

пост об этом:

http://forums.silverlight.net/forums/p/93400/214554.aspx

Вы можете посмотреть файл js, который я разместил здесь: Определить версию Silverlight требуется сборкой

Ваша ошибка ожидаема. Поскольку она критична для безопасности, выше приведены некоторые обходные пути.

person James Campbell    schedule 19.02.2010
comment
GetExecutingAssembly также возвращает тип Assembly, вызов GetName завершается ошибкой. - person AnthonyWJones; 19.02.2010
comment
это должно помочь вам пройти через это, я только что проверил его, и он отлично работает. - person James Campbell; 19.02.2010
comment
Мне нравится первое решение. Вроде чище. Однако оба работают. - person Dov; 19.02.2010
comment
+1 за первое отличное решение, хотя я бы вернул имя сборки и позволил вызывающей стороне получить доступ к свойству Version. Остальное, однако, просто неуклюжая ссылка, этот ответ был бы намного лучше и чище, если бы был простой первый подход. @Dov, это твой ответ ИМО. - person AnthonyWJones; 19.02.2010
comment
Отличное решение. Сумасшествие в том, что Assembly.GetCustomAttributes не возвращает атрибут AssemblyVersion — он возвращает большинство других, которые я ожидал (компания/торговая марка/и т. д.) - person JMarsch; 28.03.2012

GetName помечен как критический для безопасности, и поэтому вы получаете исключение при попытке вызвать его.

Вам нужно будет использовать свойство FullName и проанализировать Version=x.x.x.x часть строки.

person AnthonyWJones    schedule 19.02.2010
comment
они действительно параноики, ребята из майкрософта, не так ли - person herzmeister; 19.02.2010
comment
@herzmeister der welten: Достаточно одного незначительного сбоя в песочнице Silverlight, чтобы нанести серьезный ущерб ее репутации. На данном этапе жизни Silverlight Microsoft не может позволить себе такой сбой. Я подозреваю, что есть много вещей, которые на самом деле не представляют угрозы, но поскольку они не являются жизненно важными и не прошли тщательного анализа безопасности и тестирования, они будут иметь атрибут «Критический для безопасности», просто чтобы быть в безопасности. - person AnthonyWJones; 19.02.2010

Ты можешь использовать

Assembly.GetExecutingAssembly()
 .GetCustomAttributes(false).OfType<AssemblyVersionAttribute>()
 .Single().Version;
person gius    schedule 23.04.2012
comment
GetCustomAttributes(bool) не будет возвращать AssemblyVersionAttribute, так как он обрабатывается особым образом. Вы по-прежнему можете использовать AssemblyFileVersionAttribute, и он будет работать. В противном случае спасибо за ответ, который не включает синтаксический анализ строк :) - person noaRAVE; 29.08.2014