10

これは、継承されたすべてのメソッドが再実装されていることを確認するために内部のすべてのクラスをテストできるように、C++/CLI およびマネージド C++ アセンブリを見つける方法として始まりました。これをビルド プロセスのステップとして追加し、二度と起こらないようにしたいと思います。

この問題について考えると、使用されている .NET 言語を特定できると興味深いので、少し興味がわきました。このため、もう少し踏み込んで、すべての .NET 言語のアセンブリを比較しました。これまでのところ、リフレクションを介して .NET アセンブリの任意のセットからの型と属性データを比較する、私が作成した小さなプログラムを通じて見つけたものは次のとおりです。

  • C# - AssemblyConfigurationAttribute あり、GuidAttribute あり
  • VB - 多くの追加の「My」タイプ (例: MyApplication、MySettings) があり、GuidAttibute があります
  • F# - 使用されるコンパイラのバージョンも指定する FSharpInterfaceDataVersionAttribute があります。
  • C++ (/clr:safe を除くすべて) - 追加の型が多数あります (FrameInfo、type_info)
  • C++ /clr:safe - 固有のリフレクション機能がないようです。

次の順序で解析するのが合理的かもしれません。

  1. FSharpInterfaceDataVersionAttribute があれば F# です
  2. 私が見つけた余分な型の膨大なセットに含まれている場合、それは C++ です。
  3. 「My*」タイプがあれば VB です。
  4. AssemblyConfigurationAttribute または GuidAttribute がある場合は C# です。
  5. C++ /clr:Safe である可能性が高い

ただし、これは恐ろしいハッキングであるため、ここでチェックインして、利用可能な別のオプションがないことを確認したいと思いました.

4

2 に答える 2

3

VBやF#クラスライブラリなどの参照をチェックすることは、これを行うための最も不安定な方法のようですが、他の人が言及しているように、これはヒューリスティックです-ネイティブバイナリがどの言語で書かれているかを判断する明確な方法がないのと同じです(しかしヒューリスティックによってほぼ100%確信できます)

于 2009-02-24T06:53:52.773 に答える
2

.NET言語をコンパイルすると、取得できるのはILだけです。どの特定の言語がアセンブリを作成したかを判断する標準的な方法を私は知りません。既存のアセンブリを取得して、それをILにildasm(分解)し、それらをilasm(アセンブル)して実質的に同一のアセンブリに戻すことができます。

使用するヒューリスティックは、アセンブリの作成に使用される言語を識別するための合理的で賢い方法です。ただし、これらの詳細は、言語のコンパイラバージョン間で変更される可能性があることに注意してください。

于 2009-02-24T06:27:54.240 に答える