Aracılığıyla paylaş


Sistem. Düşünceler. Emit.AssemblyBuilder sınıfı

Bu makale, bu API'nin başvuru belgelerine ek açıklamalar sağlar.

Dinamik derleme, Düşünceler ion Emit API'leri kullanılarak oluşturulan bir derlemedir. Dinamik derleme, başka bir dinamik veya statik derlemede tanımlanan türlere başvurabilir. Aynı uygulama çalıştırması sırasında bellekte dinamik derlemeler oluşturmak ve kodlarını yürütmek için kullanabilirsiniz AssemblyBuilder . .NET 9'da, derlemeyi bir dosyaya kaydetmenize olanak tanıyan tam olarak yönetilen yansıma yayma uygulamasına sahip yeni bir PersistedAssemblyBuilder ekledik. .NET Framework'te ikisini de yapabilirsiniz; dinamik derlemeyi çalıştırın ve bir dosyaya kaydedin. Kaydetme için oluşturulan dinamik derleme kalıcı derleme olarak adlandırılırken, normal yalnızca bellek derlemesi geçici veya çalıştırılabilir olarak adlandırılır. .NET Framework'te dinamik derleme bir veya daha fazla dinamik modülden oluşabilir. .NET Core ve .NET 5+ içinde dinamik derleme yalnızca bir dinamik modülden oluşabilir.

Örnek oluşturma AssemblyBuilder şekliniz her uygulama için farklılık gösterir, ancak modül, tür, yöntem veya sabit listesi tanımlama ve IL yazma adımları oldukça benzerdir.

.NET'te çalıştırılabilir dinamik derlemeler

Çalıştırılabilir AssemblyBuilder bir nesne almak için yöntemini kullanın AssemblyBuilder.DefineDynamicAssembly . Dinamik derlemeler aşağıdaki erişim modlarından biri kullanılarak oluşturulabilir:

Dinamik derleme tanımlandığında ve daha sonra değiştirilemediğinde yöntemine AssemblyBuilder.DefineDynamicAssembly yapılan çağrıda uygun AssemblyBuilderAccess değer sağlanarak erişim modu belirtilmelidir. Çalışma zamanı, derlemenin iç gösterimini iyileştirmek için dinamik derlemenin erişim modunu kullanır.

Aşağıdaki örnekte derleme oluşturma ve çalıştırma işlemleri gösterilmektedir:

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 }));
}

.NET'te kalıcı dinamik derlemeler

'den AssemblyBuilder türetilen ve dinamik derlemelerin .NET Core'a kaydedilmesine izin veren yeni PersistedAssemblyBuilder tür, PersistedAssemblyBuilder sayfasından kullanım senaryolarını ve örneklerini denetleyin.

.NET Framework'te kalıcı dinamik derlemeler

.NET Framework'te dinamik derlemeler ve modüller dosyalara kaydedilebilir. Bu özelliği desteklemek için numaralandırma AssemblyBuilderAccess iki ek alan bildirir: Save ve RunAndSave.

Kalıcı dinamik derlemedeki dinamik modüller, dinamik derleme yöntemi kullanılarak Save kaydedildiğinde kaydedilir. Yürütülebilir dosya oluşturmak için, derlemenin SetEntryPoint giriş noktası olan yöntemi tanımlamak için yöntemi çağrılmalıdır. Yöntem bir konsol uygulamasının veya Windows tabanlı bir uygulamanın oluşturulmasını SetEntryPoint istemediği sürece derlemeler varsayılan olarak DLL olarak kaydedilir.

Aşağıdaki örnekte .NET Framework kullanarak derleme oluşturma, kaydetme ve çalıştırma işlemleri gösterilmektedir.

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");
}

ve gibi GetModulesGetLoadedModulestemel Assembly sınıftaki bazı yöntemler nesnelerden AssemblyBuilder çağrıldığında düzgün çalışmaz. Tanımlı dinamik derlemeyi yükleyebilir ve yüklenen derlemede yöntemleri çağırabilirsiniz. Örneğin, kaynak modüllerinin döndürülen modül listesine eklendiğinden emin olmak için yüklenen Assembly nesneye çağrı GetModules yapın. Dinamik derleme birden fazla dinamik modül içeriyorsa derlemenin bildirim dosyası adı, yöntemin ilk bağımsız değişkeni olarak belirtilen modülün adıyla DefineDynamicModule eşleşmelidir.

kullanarak KeyPair dinamik derleme imzalama işlemi, derleme diske kaydedilene kadar etkili olmaz. Bu nedenle, tanımlayıcı adlar geçici dinamik derlemelerle çalışmaz.

Dinamik derlemeler başka bir derlemede tanımlanan türlere başvurabilir. Geçici dinamik derleme, başka bir geçici dinamik derlemede, kalıcı bir dinamik derlemede veya statik bir derlemede tanımlanan türlere güvenle başvurabilir. Ancak, ortak dil çalışma zamanı kalıcı bir dinamik modülün geçici bir dinamik modülde tanımlanan bir türe başvurmasına izin vermez. Bunun nedeni, kalıcı dinamik modül diske kaydedildikten sonra yüklendiğinde çalışma zamanının geçici dinamik modülde tanımlanan türlere yönelik başvuruları çözümleyememesidir.

Uzak uygulama etki alanlarına yayma kısıtlamaları

Bazı senaryolar, uzak uygulama etki alanında dinamik derleme oluşturulmasını ve yürütülmesini gerektirir. Düşünceler ion yayma, bir dinamik derlemenin doğrudan uzak uygulama etki alanına gönderilmesine izin vermez. Çözüm, dinamik derlemeyi geçerli uygulama etki alanında yaymak, yayılan dinamik derlemeyi diske kaydetmek ve ardından dinamik derlemeyi uzak uygulama etki alanına yüklemektir. Uzaktan iletişim ve uygulama etki alanları yalnızca .NET Framework'te desteklenir.