1

据我从网站上可以看出,以下代码应编译为具有顶级属性的 DLL Version

namespace MyLibrary

[Module]
class MainClass:
    public static Version as string

    static def constructor():
        Version = "0.1"

这可以编译,但是如果我随后将这些命令输入booish

import MyLibrary
print (Version)

然后我得到“错误:未知标识符:'版本'”。

大概这段代码在该语言的早期版本中工作。我正在使用 0.9.4.9。实现这种效果的正确方法是什么?

(我注意到有一个隐式静态类MyVersionModule,其中放置了顶级静态方法,但我也不知道如何向它添加属性)。

4

1 回答 1

0

在 .net 中,没有办法拥有实际上不是类成员的方法或字段。Boo 通过在模块中包含主文件的隐式类(正如您所注意到的)在某种程度上隐藏了这一点,但是在导入时您仍然需要以成员身份访问它。

对于静态,您必须先引用类型,然后再引用成员,因此在您的示例中打印版本将如下所示:

import MyLibrary
print (MainClass.Version)

当然,这不是在 .net 中存储版本信息的“正确”方式,而是使用程序集级属性。那看起来更像这样:

[assembly: System.Reflection.AssemblyVersion("1.0")]

namespace MyLibrary

[Module]
class MainClass:
  pass

然后获取使用反射的版本,有几种获取程序集的方法,但最简单的是获取类型,然后是程序集:

import System
import System.Reflection
import MyLibrary

atts = typeof(MainClass).Assembly \
         .GetCustomAttributes(typeof(AssemblyVersionAttribute), false)

version = (atts[0] as AssemblyVersionAttribute).Version
print(version)
于 2012-04-24T19:59:38.680 回答