Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu makale, bu API'nin başvuru belgelerine ek açıklamalar sağlar.
Dinamik derleme, Yansıma Yayma 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 bir AssemblyBuilder nesnesi almak için AssemblyBuilder.DefineDynamicAssembly yöntemini kullanın. Dinamik derlemeler aşağıdaki erişim modlarından biri kullanılarak oluşturulabilir:
-
tarafından temsil edilen AssemblyBuilder dinamik derleme, yayılan kodu yürütmek için kullanılabilir.
AssemblyBuilderAccess.RunAndCollect
tarafından oluşturulan AssemblyBuilder dinamik derleme, yayılan kodu yürütmek için kullanılabilir ve çöp toplayıcı tarafından otomatik olarak geri kazanılır.
Dinamik derleme tanımlandığında erişim modu, AssemblyBuilderAccess yöntemine yapılan çağrıda uygun AssemblyBuilder.DefineDynamicAssembly değeri sağlanarak belirtilmelidir ve daha sonra değiştirilemez. Ç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
.NET'te, PersistedAssemblyBuilder türü AssemblyBuilder'dan türetilmiştir ve dinamik derlemeleri kaydetmenize olanak tanır. Daha fazla bilgi için PersistedAssemblyBuilder'daki kullanım senaryolarına ve örneklere bakın.
.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, Save yöntemi kullanılarak dinamik derlemeler kaydedildiğinde kaydedilir. Yürütülebilir dosya oluşturmak için, derlemenin giriş noktası olan yöntemi tanımlamak amacıyla SetEntryPoint 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");
}
Temel Assembly sınıfındaki GetModules ve GetLoadedModules gibi bazı yöntemler, AssemblyBuilder nesnelerinden ç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 GetModules nesneye çağrı Assembly 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. Yansıma 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.