DotPeekのようなものを使用してDLLを逆コンパイルする場合、それが元々VB.NetでコーディングされたのかC#でコーディングされたのかをどのように判断できますか?
簡単に見分ける方法はありませんが、逆コンパイルされたコードの一部に物語の兆候(つまり手がかり)があるかもしれないと私は思いますか?
DotPeekのようなものを使用してDLLを逆コンパイルする場合、それが元々VB.NetでコーディングされたのかC#でコーディングされたのかをどのように判断できますか?
簡単に見分ける方法はありませんが、逆コンパイルされたコードの一部に物語の兆候(つまり手がかり)があるかもしれないと私は思いますか?
Microsoft.VisualBasic
ライブラリへの参照を探すことができます。それが存在する場合は、コードがVBを使用して作成された可能性が非常に高くなります。ライブラリはC#プロジェクトにも含まれることがありますが、それはあまり一般的ではありません。参照がない場合、それは確かにVBではありません。
(まあ、コマンドラインコンパイラと特別なコンパイラスイッチを使用してライブラリなしでVBをコンパイルすることは可能ですが、それは非常にまれです。)
VisualBasic
ライブラリの使用頻度も確認できます。通常のVBプログラムでは頻繁に使用されますが、C#プログラムでは通常、呼び出しなど、他のライブラリでは使用できない特定のタスクにのみ使用されDateDiff
ます。
CInt
またはのようなVB固有のコマンドは、ライブラリMid
への呼び出しとして表示され、文字列で使用される場合VisualBasic
は演算子でさえライブラリを使用します。=
このコード(ここでa
、b
は文字列です):
If a = b Then
は実際にライブラリ呼び出しを行って比較を行い、C#として逆コンパイルすると次のように表示されます。
if (Operators.CompareString(a, b, false) == 0) {
考えられるルートの1つは、名前付きインデクサーを探すことです。C#では許可されていません。つまり、C#では次のものしか使用できません。
object this [int index] {get;set;}
しかし、マネージC ++およびVB.Net(私が間違っている場合はこれを削除すると思います)では、インデクサーに名前を付けることができるようです。
したがって、少なくともC#であるかどうかに絞り込むことができます
完全を期すために、私が知っている手がかりを投稿します。
C#に逆コンパイルし、$ static $で始まる無効なメンバー名を見つけた場合:
private short $STATIC$Report_Print$20211C1280B1$nHeight;
...これは、コンパイラが「静的」VBキーワードを実装するためにそれらを使用するため、おそらくVB.Netであったことを意味します。
HansPassantとJonSkeetは、ここでそれをよりよく説明しています:https: //stackoverflow.com/a/7311567/22194 https://stackoverflow.com/a/7310497/22194
My
名前空間についてまだ誰も言及していないことに驚いています。VB.NETコンパイラにそのヘルパークラスの一部を出力に含めないようにすることは非常に困難です。
もともとVB.NetでコーディングされたのかC#でコーディングされたのかを知るにはどうすればよいですか?
あなたはそれを信頼できる方法で言うことはできません。もちろん、VB.NETコンパイラでコンパイルされたILには、いくつかのVB固有のアセンブリ(などMicrosoft.VisualBasic
)への参照が含まれますが、C#プロジェクトがそれらのアセンブリを参照して使用することを妨げるものは何もありません。
他の回答で紹介されたアイデアに基づいて構築するために、アセンブリはそれを書くために使用された言語を報告しませんが、非cls準拠のコードを探すことができます
CLSに準拠しているということは、すべてのCLS準拠の言語で利用できる機能に対してコードが記述されていることを意味します。つまり、パブリックのネストされたクラスや名前付きインデクサーはなく、ILがサポートする可能性のある他の多くの機能はありますが、特定の言語ではサポートされない可能性があります。
それがオプションである場合、おそらくPDBを見るだけでよいでしょう。