をコンパイルすることができるようになります
assemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(assemName, AssemblyBuilderAccess.RunAndSave);
module = assemblyBuilder.DefineDynamicModule(Filename);
module.DefineType(name, TypeAttributes.Public | TypeAttributes.Class)
を使用して定義する必要がありますType
に由来します。したがって、タイプをまだファイナライズしていなくても(CreateType()
を呼び出して)、それを使って別のタイプのローカル変数を宣言することができます。
私が遭遇したもう1つの障壁は、未完了のTypeBuilder
のGetConstructor()
が機能しないことです(例外がスローされます)。しかし、デフォルトのコンストラクタを明示的に作成した場合は、ConstructorBuilder
から呼び出すことができます。
static void Main()
{
var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(
new AssemblyName("foo"), AssemblyBuilderAccess.RunAndSave);
var module = assemblyBuilder.DefineDynamicModule("foo.dll");
var aType = module.DefineType(
"A", TypeAttributes.Public | TypeAttributes.Class);
var bType = module.DefineType(
"B", TypeAttributes.Public | TypeAttributes.Class);
var aCtor = aType.DefineDefaultConstructor(MethodAttributes.Public);
var bCtor = bType.DefineDefaultConstructor(MethodAttributes.Public);
CreateMethodM(aType, bType, bCtor);
CreateMethodM(bType, aType, aCtor);
aType.CreateType();
bType.CreateType();
assemblyBuilder.Save("foo.dll");
}
static void CreateMethodM(
TypeBuilder thisType, Type otherType, ConstructorInfo otherCtor)
{
var method = thisType.DefineMethod(
"M", MethodAttributes.Private, typeof(void), Type.EmptyTypes);
var il = method.GetILGenerator();
var local = il.DeclareLocal(otherType);
il.Emit(OpCodes.Newobj, otherCtor);
il.Emit(OpCodes.Stloc, local);
il.Emit(OpCodes.Ret);
}
何が役立ちますか? –
@phoog:彼は誰かが自分の仕事をするのを待っているかもしれません。 –
実際にはC#はここにはありません。それは円の依存関係の例に過ぎません –