System.CodeDom.CodeCompileUnit kullanarak bazı türleri dinamik olarak oluşturdum, bunları bellekte IL koduna derlemek ve IL kodunun belleğe yüklenmiş bir derleme içine enjekte edilmesi - bu diske herhangi bir kaydetmeniz gerekmiyor. Belki de planım yanlıştır. Söz konusu hedefe bu CodeCompileUnit örneğinin nasıl alınacağıyla ilgili diğer önerilere açıktır.Kodu nasıl yüklerim ve yüklü bir aksamına enjekte edebilirim?
cevap
ICorDebug
arabirimlerini kullanarak varolan (önceden yüklenmiş) bir derlemeye kodu enjekte edebilirsiniz. Düzenle ve Devam et bunu yapar.
Delta baytlarınızı hesaplayın ve ICorDebugModule2::ApplyChanges
numaralı telefonu arayın. Daha fazla bilgi için MDbg sample code'a bakın.
Bir zamanlar ICorDebugModule::GetEditAndContinueSnapshot
'u kullandık ve akraba olduk, ancak bunlar artık kullanımdan kaldırıldı.
Güncelleme sadece yeni bir montaj daha verimli ve çok daha kolay oluşturmak için Reflection.Emit
kullanarak, halihazırda yüklü derleme kod enjekte umurumda değil ise.
Bu çözüm, doğrudan soruyu yanıtlıyor. Teşekkürler. –
Ayrıca System.Reflection.Emit ad alanını kullanabilir ve bir dinamik, bellek içi derleme oluşturabilirsiniz.
Alternatif, CodeDom'u & derleme kodunu oluşturmak için kullanmaktır, daha sonra buna çağrı yapın.
XMLSerialization() bunu yapar.
IL'yi değiştirmek için Mono.Cecil kullanabilirsiniz. Bu bir şekilde güçlü bir araçtır, ancak bir şekilde belgelere sahip değildir.
- 1. Açısal2 konumuna nasıl enjekte edebilirim?
- 2. Sağlayıcı bileşeni nasıl enjekte edebilirim?
- 3. Scons'ta, oluşturulacak bir hedefi nasıl enjekte edebilirim?
- 4. .NET Framework'ü, henüz yüklü olmadığında nasıl yüklerim?
- 5. ServiceStack AuthSession'ı depo sınıflarıma nasıl enjekte edebilirim?
- 6. İzolatı direktifin içine nasıl enjekte edebilirim?
- 7. testleri mutlaka yüklü kodu
- 8. Bu kodu nasıl optimize edebilirim?
- 9. Bir filtre için birim testine alay hizmetini nasıl enjekte edebilirim?
- 10. Bir Spring bağımlılığını kimliğe göre nasıl enjekte edebilirim?
- 11. JIT, belleğe enjekte edilen kodu nasıl derlenir ve çalıştırılır?
- 12. Windows'da emacs'i nasıl yüklerim?
- 13. CSS ve Javascript'i bir krom uzantısına yüklenen bir iframe içine nasıl enjekte edebilirim
- 14. Firebug'da HTML'yi nasıl düzenler ve yeniden yüklerim?
- 15. Erişim kontrolünü mvc uygulamasının servis katmanına nasıl enjekte edebilirim?
- 16. HttpServletRequest'i fasulyeye enjekte ettim. Üniteyi nasıl test edebilirim?
- 17. İlkbaharda, ana fasulyede çocuk fasulyesi nasıl enjekte edebilirim?
- 18. Yay: Bahar yapılandırmada ENUM'u jeneriklerle nasıl enjekte edebilirim?
- 19. Yüklü Ruby taşlarının tüm bağımlılıklarının tatmin edildiğini nasıl kontrol edebilirim?
- 20. NServicebus ileti işleyicisinde nasıl çoklu depoları enjekte edebilirim?
- 21. Yüklü OpenSSL sürümünün> = 0.9.8k olup olmadığını nasıl kontrol edebilirim?
- 22. Dosya değiştiğinde kodu lib/otomatik olarak nasıl yüklerim?
- 23. Ubuntu'ya M2Crypto nasıl yüklerim?
- 24. Tarayıcı açık sekmesinde ADF ile javascript kodu nasıl enjekte edilir?
- 25. Apache Velocity'i nasıl yüklerim ve kullanırım?
- 26. php ve mysql kullanarak müzik nasıl yüklerim
- 27. NuGet olmadan RESTSharp'ı nasıl yüklerim ve kurarım?
- 28. UIView'i nasıl yeniden yüklerim?
- 29. 3gp dosyalarını nasıl yüklerim
- 30. Uygun yerelleştirilmiş dosyayı nasıl yüklerim?
Türleri önceden yüklenmiş bir aksamına neden enjekte etmeniz gerekiyor? Onları neden şu anda inşa ettiğin bir meclise enjekte edemezsin? – yfeldblum
@Justice: Bu iyi bir nokta - her şeyden çok bir merak. Mümkün olan senaryolara uymak zorunda olsaydım, sanırım: sadece bellekte çalışarak yapı meclisleri hakkındaki dosya sistemi izinlerini tersine çevirmek; ya da belki bir derleme içine kod enjekte etmek ve uygulamayı yeniden derlemek gerekmeden işleri denetlemek için dinamik olarak çağırmak. –
Bunu yapmanın bir yolu olduğundan emin değilim. Varsa, ben de bilmek isterim. –