获取给定类型的编程语言

时间:2013-09-24 09:46:00

标签: c# .net reflection

我引用了某些程序集中的类型和类。

var type = typeof(SomeNamespace.SomeClass);

有没有办法获得关于使用什么编程语言来编写这个类的元数据? C#或VB或F#?

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

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

UPD:

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

UPD2:

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

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

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

3 个答案:

答案 0 :(得分:9)

.NET没有做出这种区分,你也没有很好的理由。

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

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

答案 1 :(得分:5)

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

你可以尝试在IL中搜索模式来尝试找出源语言,但是如果它容易出错。我不确定它会带来什么好处。

答案 2 :(得分:1)

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

请参阅How to get the assembly (System.Reflection.Assembly) for a given type in .Net?

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

如果您自己编译,则可以将元数据添加到二进制文件中作为构建后事件。有关如何添加的详细信息,请参阅Read/Write 'Extended' file properties (C#)。在构建事件中,您将能够访问有关项目的信息 - 例如它的编译语言。