2009-11-15 18 views
7

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?

+1

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

+1

@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. –

+0

Bunu yapmanın bir yolu olduğundan emin değilim. Varsa, ben de bilmek isterim. –

cevap

7

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.

+0

Bu çözüm, doğrudan soruyu yanıtlıyor. Teşekkürler. –

1

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.

1

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.

İlgili konular