.NETで記述されたライブラリをアンマネージコードに対して明確にします

Meta TraderのMQLでプログラミングに携わっている会社で半年間働いた後、そのような注文に出くわしました。クライアントはプログラムをC#またはVB.Netで作成する必要があります。

タスクは、アプリケーションをMQLトレーディングアドバイザーと接続するのと同じ言語でC#とdllでプログラムを作成することでした。 C#を1年以上研究しているので、一方ではこれが手元にありますが、他方では理解しにくくなっていますが、これはどのように行われ、可能ですか?
画像

C#で記述されたライブラリのコードにエクスポート用のセクションがないことは周知の事実であり、関数の名前を実際に転送することはできません。 インターネットで数時間検索したところ、解決策が存在することがわかりました。解決策は次のとおりです。

そこでILについて何か聞いたことがありますが、私の目にはこの奇跡を見たことはありません。 この問題にあまり関係のない文献を探す必要がないように、すべてを段階的に説明します。 その結果、どのプログラムからでも完全に実行されるライブラリを取得します。

それでは始めましょう:
まず、通常のライブラリを作成します。このライブラリには2つのメソッドがあり、最初のメソッドはお気に入りの「Hello、World!」を画面に表示し、2番目のメソッドは2つの数値の合計を返します。

後で見つけやすい関数の名前を選択することをお勧めします。
実際、これはライブラリコードの外観です。

using System; using System.Windows.Forms; namespace Test { public class Class1 { public static void Message_Export(String message) { MessageBox.Show(message); } public static Double Sum_Export(Double a, Double b) { return a + b; } } } 


オプションのファイル内のより便利な検索のためにのみ、関数名の「エクスポート」に注意してください。 public修飾子は指定するかどうかを指定できます。エクスポートされた関数の場合、これは大きな役割を果たしませんが、メソッドは静的である必要があります。

次に、このライブラリをコンパイルし、Visual Studioコマンドラインを使用して逆コンパイラを実行します
[スタート]> [すべてのプログラム]> [Microsoft Visual Studio 2010]> [Visual Studioツール]> [コマンドラインVisual Studio(2010)]。 ildasmと書き、Enterキーを押します。
画像

表示されるプログラムで、[ファイル]> [開く]をクリックし、ライブラリへのパスを指定します
画像
ライブラリのクラスとメソッドのツリーを取得します

次に、File> Dump、すべての設定をデフォルトのままにして、ファイルを名前で保存します。たとえば、Test.ilをディスクに保存します。ファイルは簡単に見つかります。D:\
画像

実際、逆コンパイルが終了しても、重いものは何もありません。 次に、作成したTest.ilファイルをテキストエディターを使用して開き、コードを確認します。これは一見すると完全に理解できないようです。 複雑なことは何もありませんが、特に何がどこにあるかを知る必要はありません。
まず、エントリ「.corflags 0x00000001」を見つけます。これは、ファイルにilコードのみが含まれていることを意味し、コンパイラは関数をエクスポートするすべての試行を単に無視し、「。corflags 0x00000002」に変更します。

ファイルの同じセクションで、.corflagsを書き込んだ直後に、2つの関数のメモリを消去する必要があります。

 .vtfixup [1] int32 fromunmanaged at VT_01 .vtfixup [1] int32 fromunmanaged at VT_02 .data VT_01 = int32(0) .data VT_02 = int32(0) 


コード編集の最後のステップは、必要な機能のエクスポートです。
最初の関数を見つける

 .method public hidebysig instance void Message_Export(string message) cil managed { //  : 9 (0x9) 


コメントは削除できますが、これは必要ありません。 コンパイラはそれらをdllに追加しません。
関数の最初に、次の形式のレコードを書き込みます。

 .vtentry 1 : 1 .export [1] as Message 


実際にはMessageという名前で、この関数はライブラリから呼び出されます。

秒の初めに

 .method public hidebysig instance float64 Sum_Export(float64 a, float64 b) cil managed { //  : 9 (0x9) 


挿入する
 .vtentry 1 : 2 .export [2] as Sum 

それに応じて。

残っているのは、ライブラリを組み立てるだけです。 Visual Studioコマンドプロンプトで、次のように記述します。
ilasm /OUT:D:\Test.dll D:\ Test.il / dll

「Operation Completed Sucefully」というメッセージを受け取った場合、すべてが正しく行われ、ライブラリがコンパイルされています。
画像

Source: https://habr.com/ru/post/J137300/


All Articles