获取Silverlight程序集的运行时版本

26

我想在关于框中显示我的Silverlight 3应用程序的版本号,但是当我使用传统的 .Net 调用时:

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

我在调用GetName()时遇到了MethodAccessException异常。请问我该如何获取程序集的版本号?

3个回答

48
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文件:Detect Silverlight version required by an assembly

您的错误是预期的,因为它很重要,上面有一些解决方法。


2
GetExecutingAssembly也返回一个Assembly类型,它调用GetName会失败。 - AnthonyWJones
那应该可以帮你解决问题,我刚测试过,它运行良好。 - James Campbell
我喜欢第一个解决方案。它看起来更简洁。不过两个都是可以工作的。 - Dov
+1 对于第一个优秀的解决方案,尽管我会返回一个程序集名称并让调用者访问“Version”属性。然而,其余部分只是笨重的链接堆积,如果只采用简单的第一种方法,这个答案会更好、更干净。@Dov,这是我认为你的答案。 - AnthonyWJones
很棒的解决方案。疯狂的是,assembly.GetCustomAttributes没有返回AssemblyVersion属性 - 它返回了我预期的大多数其他属性(公司/商标等)。 - JMarsch

6

GetName被标记为安全关键,因此当您尝试调用它时会出现异常。

您需要使用FullName属性并解析字符串中的Version=x.x.x.x部分。


他们真的很偏执,微软的人不是吗? - herzmeister
2
@herzmeister der welten:Silverlight沙盒只要出现一点小问题,就会对其声誉造成严重损害。在Silverlight的生命周期的这个阶段,微软不能承担任何此类问题。我怀疑有很多东西实际上并不构成威胁,但由于它们不是必需的,并且没有经过彻底的安全分析和测试,它们将具有安全关键属性,以确保安全。 - AnthonyWJones

1

您可以使用

Assembly.GetExecutingAssembly()
 .GetCustomAttributes(false).OfType<AssemblyVersionAttribute>()
 .Single().Version;

GetCustomAttributes(bool) 不会返回 AssemblyVersionAttribute,因为它被以“特殊”的方式处理。你仍然可以使用 AssemblyFileVersionAttribute,它会起作用。否则,感谢你的答案,不需要解析字符串 :) - noaRAVE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接