Sdílet prostřednictvím


Systému. Reflexe ion. Emit.AssemblyBuilder – třída

Tento článek obsahuje doplňující poznámky k referenční dokumentaci pro toto rozhraní API.

Dynamické sestavení je sestavení vytvořené pomocí rozhraní API pro generování Reflexe ionu. Dynamické sestavení může odkazovat na typy definované v jiném dynamickém nebo statickém sestavení. Můžete použít AssemblyBuilder k vygenerování dynamických sestavení v paměti a spuštění jejich kódu během stejného spuštění aplikace. V .NET 9 jsme přidali nový PersistedAssemblyBuilder s plně spravovanou implementací generování reflexe, která umožňuje uložit sestavení do souboru. V rozhraní .NET Framework můžete provést obojí – spustit dynamické sestavení a uložit ho do souboru. Dynamické sestavení vytvořené pro ukládání se nazývá trvalé sestavení, zatímco běžné sestavení jen pro paměť se nazývá přechodné nebo spustitelné. V rozhraní .NET Framework se dynamické sestavení může skládat z jednoho nebo více dynamických modulů. V .NET Core a .NET 5+ se dynamické sestavení může skládat pouze z jednoho dynamického modulu.

Způsob vytvoření AssemblyBuilder instance se pro každou implementaci liší, ale další kroky pro definování modulu, typu, metody nebo výčtu a pro psaní IL jsou poměrně podobné.

Spustitelná dynamická sestavení v .NET

K získání spustitelného AssemblyBuilder objektu použijte metodu AssemblyBuilder.DefineDynamicAssembly . Dynamická sestavení lze vytvořit pomocí jednoho z následujících režimů přístupu:

Režim přístupu musí být určen poskytnutím příslušné AssemblyBuilderAccess hodnoty ve volání AssemblyBuilder.DefineDynamicAssembly metody při definování dynamického sestavení a nelze ji později změnit. Modul runtime používá režim přístupu dynamického sestavení k optimalizaci interní reprezentace sestavení.

Následující příklad ukazuje, jak vytvořit a spustit sestavení:

public void CreateAndRunAssembly(string assemblyPath)
{
    AssemblyBuilder ab = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName("MyAssembly"), AssemblyBuilderAccess.Run);
    ModuleBuilder mob = ab.DefineDynamicModule("MyModule");
    TypeBuilder tb = mob.DefineType("MyType", TypeAttributes.Public | TypeAttributes.Class);
    MethodBuilder mb = tb.DefineMethod("SumMethod", MethodAttributes.Public | MethodAttributes.Static,
                                                                   typeof(int), new Type[] {typeof(int), typeof(int)});
    ILGenerator il = mb.GetILGenerator();
    il.Emit(OpCodes.Ldarg_0);
    il.Emit(OpCodes.Ldarg_1);
    il.Emit(OpCodes.Add);
    il.Emit(OpCodes.Ret);

    Type type = tb.CreateType();

    MethodInfo method = type.GetMethod("SumMethod");
    Console.WriteLine(method.Invoke(null, new object[] { 5, 10 }));
}

Trvalá dynamická sestavení v .NET

Nový PersistedAssemblyBuilder typ odvozený z AssemblyBuilder a umožňuje uložit dynamická sestavení v .NET Core, zkontrolovat scénáře použití a příklady ze stránky PersistedAssemblyBuilder .

Trvalá dynamická sestavení v rozhraní .NET Framework

V rozhraní .NET Framework lze dynamická sestavení a moduly ukládat do souborů. Pro podporu této funkce AssemblyBuilderAccess výčet deklaruje dvě další pole: Save a RunAndSave.

Dynamické moduly v trvalém dynamickém sestavení jsou uloženy při uložení dynamického sestavení pomocí Save metody. Chcete-li vygenerovat spustitelný soubor, SetEntryPoint musí být volána metoda, která je vstupním bodem sestavení. Sestavení se ve výchozím nastavení ukládají jako knihovny DLL, pokud SetEntryPoint metoda nepožádá o generování konzolové aplikace nebo aplikace založené na systému Windows.

Následující příklad ukazuje, jak vytvořit, uložit a spustit sestavení pomocí rozhraní .NET Framework.

public void CreateRunAndSaveAssembly(string assemblyPath)
{
    AssemblyBuilder ab = Thread.GetDomain().DefineDynamicAssembly(new AssemblyName("MyAssembly"), AssemblyBuilderAccess.RunAndSave);
    ModuleBuilder mob = ab.DefineDynamicModule("MyAssembly.dll");
    TypeBuilder tb = mob.DefineType("MyType", TypeAttributes.Public | TypeAttributes.Class);
    MethodBuilder meb = tb.DefineMethod("SumMethod", MethodAttributes.Public | MethodAttributes.Static,
                                                                   typeof(int), new Type[] {typeof(int), typeof(int)});
    ILGenerator il = meb.GetILGenerator();
    il.Emit(OpCodes.Ldarg_0);
    il.Emit(OpCodes.Ldarg_1);
    il.Emit(OpCodes.Add);
    il.Emit(OpCodes.Ret);

    Type type = tb.CreateType();

    MethodInfo method = type.GetMethod("SumMethod");
    Console.WriteLine(method.Invoke(null, new object[] { 5, 10 }));
    ab.Save("MyAssembly.dll");
}

Některé metody základní Assembly třídy, například GetModules a GetLoadedModules, nebudou při zavolání z AssemblyBuilder objektů fungovat správně. Můžete načíst definované dynamické sestavení a volat metody na načtené sestavení. Pokud chcete například zajistit, aby moduly prostředků byly zahrnuty do vráceného seznamu modulů, zavolejte GetModules načtený Assembly objekt. Pokud dynamické sestavení obsahuje více než jeden dynamický modul, měl by název souboru manifestu sestavení odpovídat názvu modulu, který je zadaný jako první argument metody DefineDynamicModule .

Podepisování dynamického sestavení pomocí KeyPair není účinné, dokud se sestavení neuloží na disk. Silné názvy proto nebudou fungovat s přechodnými dynamickými sestaveními.

Dynamická sestavení mohou odkazovat na typy definované v jiném sestavení. Přechodné dynamické sestavení může bezpečně odkazovat na typy definované v jiném přechodném dynamickém sestavení, trvalé dynamické sestavení nebo statické sestavení. Modul CLR (Common Language Runtime) však neumožňuje trvalý dynamický modul odkazovat na typ definovaný v přechodném dynamickém modulu. Důvodem je to, že když se trvalý dynamický modul načte po uložení na disk, modul runtime nemůže přeložit odkazy na typy definované v přechodném dynamickém modulu.

Omezení generování do vzdálených domén aplikací

Některé scénáře vyžadují vytvoření a spuštění dynamického sestavení ve vzdálené doméně aplikace. generování Reflexe ion neumožňuje, aby dynamické sestavení bylo generováno přímo do vzdálené domény aplikace. Řešením je generovat dynamické sestavení v aktuální doméně aplikace, uložit generované dynamické sestavení na disk a pak dynamické sestavení načíst do vzdálené domény aplikace. Vzdálené komunikace a domény aplikací jsou podporovány pouze v rozhraní .NET Framework.