system.reflection.emit.ilgeneratorを使用して、vb.netでランダムを呼び出しますか?

StackOverflow https://stackoverflow.com/questions/6318139

質問

私は自分の言語から.NET実行可能ファイルの出力を生成しています...私の言語から翻訳されているオペコード(「ランダム」と呼ばれる)は、特定の範囲内でランダム数を作成することになっています。

私のコードの目標は、System.Reflection.emit.Ilgeneratorクラスを使用して乱数を生成することです。CILコードの外観を理解するために、VB.NETコードを作成しました。

Sub Main()
    Dim A As Random

    A = New Random

    Console.WriteLine(A.Next(100))
End Sub

どのIldasmが報告しています:

.method public static void  Main() cil managed
{
  .entrypoint
  .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 ) 
  // Code size       23 (0x17)
  .maxstack  2
  .locals init ([0] class [mscorlib]System.Random A)
  IL_0000:  nop
  IL_0001:  newobj     instance void [mscorlib]System.Random::.ctor()
  IL_0006:  stloc.0
  IL_0007:  ldloc.0
  IL_0008:  ldc.i4.s   100
  IL_000a:  callvirt   instance int32 [mscorlib]System.Random::Next(int32)
  IL_000f:  call       void [mscorlib]System.Console::WriteLine(int32)
  IL_0014:  nop
  IL_0015:  nop
  IL_0016:  ret
} // end of method Main::Main

ilgenerator.emitメソッドを使用してすべてを再現できます。 Line IL_0001( "NewOBJ Instance void [mscorlib] System.random ::。ctor()")を除く...

うまくいけば、私はあまりにも多くの情報を持っている人を圧倒していません。しかし、私には複雑に思える問題を説明するときは、冗長である方が良いと思います。

最後に、私はこれまでに作成したコードを持っています:

 Sub EmitRandom()
    Dim NewRandom As New Random
    Dim stringtype As Type = GetType(System.Random)

    Dim paramtypes() As Type = {GetType(Integer)}, blankparams() As Type = {}
    'Dim RandomMethod = stringtype.GetMethod("New", paramtypes)

    m_ILGen.Emit(OpCodes.Newobj, New Random().GetType)

    EmitStoreInLocal(tempVariableRnd)
    EmitLoadLocal(tempVariableRnd)

    m_ILGen.Emit(OpCodes.Callvirt, stringtype.GetMethod("Next", paramtypes))
End Sub

次のコードを発します。

.
.
.
IL_0073:  newobj     [mscorlib]System.Random
IL_0078:  stloc.2
IL_0079:  ldloc.2
IL_007a:  callvirt   instance int32 [mscorlib]System.Random::Next(int32)
.
.
.

私がすでに試したこと:

  • il_gen.emit(opcodes.newobj、... ctor())をポイントする方法を考え出す...方法がわかりません。

  • new()を指す方法を考え出す - それは.ctor()が... newはイニシャルイザー以外のものとして使用することはできません。

  • より良い放射方法を思いつくことができるまで、ランダム関数を無効にするだけです。

問題は私には難しいように思えますが、コード生成とMSILを私よりも簡単に理解し、答えを指摘してくれる人がいる人がいることを知っています。

御時間ありがとうございます、

ドミニク

役に立ちましたか?

解決

constructorinfoを使用する必要があります。

 m_ILGen.Emit(OpCodes.Newobj, GetType(Random).GetConstructor(Type.EmptyTypes))

また、ローカルからの保管と積み込みは不要です。あなたは本当に新しいランダム()に相当するものを望んでいます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top