1

我从某个程序集中引用了类型和类。

var type = typeof(SomeNamespace.SomeClass);

有没有办法获得关于编写这个类的编程语言的元数据?C# 还是 VB 还是 F#?

所以结果我想要这样的东西

var programmingLanguage = getLanguage(type); // C#

升级版:

我可以分析用于此类的程序集或命名空间吗?也许这可以成为寻找语言的线索?

UPD2:

到目前为止,我可以使用它(这只是 VB 检测的一个示例)

var referenced = type.Assembly.GetReferencedAssemblies()
    .Where((r) => r.Name.Contains("VisualBasic"));

VB 添加了 Microsoft.VisualBasic。F# 还添加了它自己的程序集,C++ 声明了很多我可以检测到的“自用”类型。所以这是“一种方式”。我知道这不容易出错。并且会有一些虚假案例。那么有没有更好的呢?

4

3 回答 3

9

.NET 没有做出这种区分,您也没有真正的理由这样做。

唯一的方法是分析使用的类型和代码模式。例如,VB 项目经常引用一组与 C# 不同的程序集。

如果您需要为自己的程序集执行此操作,我建议您创建一个自定义Attribute类并用它装饰您的程序集。

于 2013-09-24T09:50:30.063 回答
5

阅读使用了哪种编程语言的反编译程序集。.NET 程序集中没有记录源语言的工具。此外,不仅有用于 .NET 的 C#、F# 和 VB.NET 编译器,还有许多其他编译器(请参阅http://en.wikipedia.org/wiki/List_of_CLI_languages了解数量)。最后,IL 可能是直接编写的,而不是通过编译器编写的。

您可以尝试在 IL 中搜索模式以尝试找出源语言,但这样很容易出错。我也不确定它会带来什么好处。

于 2013-09-24T09:58:44.783 回答
1

见基伦的回答。另一种方法是比较程序集文件,在名称或元数据中使用一些 id 来定义其语言。

请参阅如何获取 .Net 中给定类型的程序集 (System.Reflection.Assembly)?

这只有在您自己编译时才有帮助,或者不同语言的二进制文件命名不同,或者您可以手动命名它们不同。

如果您自己编译,则可以将元数据作为构建后事件添加到二进制文件中。有关如何添加的详细信息,请参阅读/写“扩展”文件属性 (C#) 。在构建事件中,您将能够访问有关项目的信息——例如它的编译语言。

于 2013-09-24T10:02:20.537 回答