したがって、ilgeneratorを使用して動的メソッドを使用してextern DLLからメソッドを呼び出しようとしました。 DynamicMethod - 共通言語ランタイムが無効なプログラムを検出しました
delegate void Write(string text);
static void Main(string[] args)
{
byte[] bytes = File.ReadAllBytes(@"externmethod.dll");
var assembly = Assembly.Load(bytes);
var method = assembly.GetTypes()[0].GetMethod("Write");
var dynamicMethod = new DynamicMethod("Write", typeof(void), new Type[] { typeof(string) });
var ilGenerator = dynamicMethod.GetILGenerator();
ilGenerator.EmitCall(OpCodes.Call, method, null);
var delegateVoid = dynamicMethod.CreateDelegate(typeof(Write)) as Write;
delegateVoid("test");
Console.ReadLine();
}
そしてDLLコード:
using System;
class program
{
public static void Write(string text)
{
Console.WriteLine(text);
}
}
しかし、私はこの奇妙なエラーを取得しています:
An unhandled exception of type 'System.InvalidProgramException' occurred in test.exe
Additional information: Common Language Runtime detected an invalid program.
そして、私が間違ってやって何イム任意の手掛かりを持っていません?
ilGenerator.Emit(System.Reflection.Emit.OpCodes.Ldstr, "this is test");
をそして、あなたはそれを行う必要があるので、あなたは、メソッドの最後に返す必要があります:あなたはcall
を放出する前にこれを実行する必要があるので、パラメータとして文字列を受け入れる
私はあなたのコードを試みたが、それは私に別のエラーが発生します。 –
Errormessage:追加情報: 'program.Write(System.String)'メソッドにアクセスするための 'DynamicClass.Write(System.String)'メソッドによる試行が失敗しました。 –
@JustusBosschieterこれは 'MethodAccessException'です。 'Program'クラスを' public'にします。 –