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

Decompiled assemblyを読んで、どのプログラミング言語が使用されたかを確認してください。.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 に答える