Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 50355|Yanıt: 0

[Kaynak] .NET/C# Emit dinamik olarak assemble üretir

[Bağlantıyı kopyala]
2021-3-21 tarihinde yayınlandı 12:38:34 | | | |
Uygulama senaryoları, C# kodumuzla dinamik olarak bir EXE üretir, uygulama senaryoları çok sayıda olabilir; örneğin yazılım yetkilendirmesi, yetkilendirme bilgisini girebiliyorsunuz, yetkilendirilmiş bir DLL oluşturulabilir vb., bu işlevi nasıl gerçekleştireceğinizi teknik bir Emit'ten bahsetmemiz gerekir.

1. Emit'in Genel Görünümü

Yayım, emitasyon veya üretme olarak adlandırılabilir. Framework'te, Emit ile ilgili sınıflar temelde System.Reflection.Emit isim alanı altında mevcuttur. Emit'in bir yansıma unsuru olarak var olduğu görülebilir. Yansıtmadan bahsetmişken, herkes ona aşina olmalı, bu sayede montajın elemanlarını görmemizi sağlar; böylece montajın hangi tipleri içerdiği, hangi yöntemleri içerdiği gibi çok sayıda bilgi elde edebiliriz. Ancak yansımalar yalnızca 'görülebilir', Emit ise çalışma zamanında dinamik olarak kod üretebilir. Artık Emit ile kod nasıl oluşturulacağına bir göz atalım.

2. Montaj ve Yönetilen Modül

Montaj, bir veya daha fazla modül, kaynak dosyasının mantıksal bir gruplanmasıdır ve ikincil olarak montaj, yeniden kullanım, güvenlik ve sürüm için en küçük birimdir. Gördüğümüz DLL'ler ve EXE'ler assembly olarak adlandırılabilir, bir assembly birden fazla modül içerir, ancak genellikle VS derlediğinde sadece bir modül derleriz, bir montajda birden fazla modül derlemek istiyorsak csc.exe uygulama kullanmamız gerekir.

3. Kod işlemlerini dinamik olarak üretin

Öncelikle, .NET içinde her dinamik tipin hangi tiple temsil edildiğini anlamamız gerekir.

Assembly: System.Reflection.Emit.AssemblyBuilder (dinamik montajları tanımlar ve temsil eder)

Constructor: System.Reflection.Emit.ConstructorBuilder (dinamik sınıfları tanımlayan ve temsil eden bir yapıcı)

Özel Öznitelik: System.Reflection.Emit.CustomAttributeBuilder (yapıcı tarafından verilen parametreleri kullanarak sınıflar için nitelikler üretmeye yardımcı olur)

Enum: System.Reflection.Emit.EnumBuilder (enum türünü açıklar ve gösterir)

Olay: System.Reflection.Emit.EventBuilder (sınıfı tanımlayan olay)

Alan: System.Reflection.Emit.FieldBuilder (Alanları tanımlar ve temsil eder.) böyle bir sınıfı miras alamaz)

Yerel değişkenler: System.Reflection.Emit.LocalBuilder (bir yöntem veya yapıcı içindeki yerel değişkenleri temsil eder)

Yöntem: System.Reflection.Emit.MethodBuilder (dinamik bir sınıfı tanımlayan ve temsil eden bir yöntem (veya yapıcı)

Modül: System.Reflection.Emit.ModuleBuilder (modülleri dinamik montajlarda tanımlar ve temsil eder)

Parametre: System.Reflection.Emit.ParameterBuilder (metod parametreleri, olay parametreleri gibi parametreler oluşturabilir veya ilişkilendirir)

Property: System.Reflection.Emit.PropertyBuilder (Mülk türünü tanımlayın)

Sınıf: System.Reflection.Emit.TypeBuilder (çalışma zamanında sınıfın yeni bir örneğini tanımlayıp oluştur)

OpCode, ara dil (IL) direktifinin tanımıdır. Bunun için birçok talimat var, resmi Microsoft web sitesini kontrol edebilirsiniz:Bağlantı girişi görünür.

AssemblyBuilderAccess erişim kısıtlamaları

AssemblyBuilderAccess.Run; Montajın yapılabileceğini ancak kaydedilmeyeceğini gösterir.
AssemblyBuilderAccess.Save; Montajın kurtarılabileceğini, ancak uygulanamayacağını gösterir.
AssemblyBuilderAccess.RunAndSave; Montajın kaydedilip yürütülebileceğini gösterir.
AssemblyBuilderAccess.ReflectionOnly; Montajların yalnızca yansıtıcı bir bağlamda kullanılabileceğini ve uygulanamayacağını gösterir.
AssemblyBuilderAccess.RunAndCollect; Montajın boşaldılması ve belleğin geri kazanılması gerektiğini gösterir.

Kod şöyledir:

Önce emit kullanarak IL kodu üretin, ardından dinamik olarak bir assembly oluşturun ve son olarak, montajı yükleyip yöntemlerini çağırın, aşağıdaki şekilde gösterilmiştir:



Aşağıdaki görselde gösterildiği gibi oluşturulan kodu görüntülemek için ILSpy kullanın:



(Son)





Önceki:Roslyn MSBuild derleyicisi arasındaki fark
Önümüzdeki:.NET/C# Yansıtma, Emit, İfade performans testi
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com