Programlamada yönetilen veya yönetilmeyen kod nedir?


150

Ben iyi çalışır benim C # kodunda belirli bir komut kullanıyorum. Bununla birlikte, "yönetilmeyen" kodunda yanlış davranış yaptığı söylenir.

Yönetilen veya yönetilmeyen kod nedir?


Yanıtlar:


75

İşte MSDN'den yönetilmeyen kodla ilgili bazı metinler .

Bazı kütüphane kodlarının yönetilmeyen koda çağrı yapması gerekir (örneğin, Win32 gibi yerel kod API'leri). Bu, yönetilen kod için güvenlik çevresinin dışına çıkmak anlamına geldiğinden, gereken dikkat gösterilmelidir.

Yönetilen kodla ilgili diğer bazı ücretsiz açıklamalar:

  • CLR tarafından yürütülen kod.
  • Ortak dil çalışma zamanını hedefleyen kod, .NET Framework'ün temeli, yönetilen kod olarak bilinir.
  • Yönetilen kod, CLR'nin bellek yönetimi, diller arası entegrasyon, kod erişim güvenliği ve nesnelerin otomatik ömür boyu kontrolü gibi hizmetler sunması için gerekli meta verileri sağlar. IL tabanlı tüm kodlar yönetilen kod olarak yürütülür.
  • CLI yürütme ortamında yürütülen kod.

Sorununuz için:

Bunun nedeni, NUnit'in UnitTesting için kodunuzu yürütmesi ve yönetilmeyen bir kısmı olabileceğidir. Ama bundan emin değilim, bu yüzden bunu altın için almayın. Eminim birisi size bu konuda daha fazla bilgi verebilir. Umarım yardımcı olur!


12
Cevabınıza girme çabasını takdir ediyorum. ancak "yönetilen kod" un ne olduğunu bilmeyen kişiler cevabınızla ne kastettiğinizle mücadele edeceklerdir: Bilmeyecekler: "kütüphane kodu", "yönetilmeyen kod", "yerel kod API", CLR, net çerçevesinin kurulması, IL, CLI yürütme ortamı vb.
BKSpurgeon

201

Bu konu hakkında iyi bir makale.

Özetlemek,

  1. Yönetilen kod , makine koduna değil, makinedeki bazı servisler tarafından yorumlanan ve yürütülen bir ara dile derlenir ve bu nedenle bellek ve iş parçacıkları gibi tehlikeli şeyleri işleyen (umarım!) Güvenli bir çerçeve içinde çalışır. Modern kullanımda bu sık sık .NET anlamına gelir, ancak zorunlu değildir.

Aynı makineye kurulmuş bir çalışma zamanı motoru içinde yürütülen bir uygulama programı. Uygulama onsuz çalışamaz. Çalışma zamanı ortamı, programın kullandığı genel yazılım rutinleri kitaplığını sağlar ve genellikle bellek yönetimi gerçekleştirir. Ayrıca kaynak koddan yürütülebilir koda veya ara dilden yürütülebilir koda tam zamanında (JIT) dönüşüm sağlayabilir. Java, Visual Basic ve .NET'in Ortak Dil Çalışma Zamanı (CLR) çalışma zamanı motorlarına örnektir. ( Daha fazla bilgi edinin )

  1. Yönetilmeyen kod , makine koduna derlenir ve bu nedenle doğrudan işletim sistemi tarafından yürütülür. Bu nedenle yönetilen kodun zarar vermediği / güçlü şeyler yapabilme yeteneğine sahiptir. Her şey böyle çalışırdı, bu yüzden genellikle .dlls gibi eski şeylerle ilişkilendirilir.

Kendi kendine çalışan yürütülebilir bir program. İşletim sisteminden başlatılan program, işletim sistemindeki yazılım rutinlerini çağırır ve kullanır, ancak başka bir yazılım sisteminin kullanılmasını gerektirmez. Belirli bir platform için makine diline monte ve C / C ++ programları makine diline derlenmiştir Assembly dili programları yönetilmeyen kod örnekleridir. ( Devamı )

  1. Yerel kod genellikle Yönetilmeyen ile eşanlamlıdır, ancak aynı değildir.

hacklemede .net dil (C #, C ++) kullanamayacağımızı kastediyorsunuz, değil mi?
Haroon A.

7
@H_wardak 'hackleme' olarak neyi tanımlıyorsunuz? Bu çok genel bir terim, NORAD'a hack etmek ve bazı kayıtları hacklemek aynı.
Alex

7
Bir zamanlar görüşmeci tarafından sorulmuş, C # 'da yönetilmeyen kod çalıştırabilir / yazabilir miyiz? Birisi bana bu konuda yardım edebilir mi?
RSB

9
@RSB: Yönetilmeyen kodu C # 'a yazamazsınız (ancak yönetilmeyen kodu doğrudan C #' dan çağırabilirsiniz). Teorik olarak, doğru derleyici ve çerçeve ile bunu yapabilirdiniz, sanırım. Pratikte bu, C # 'dan makine kodunu doğrudan derleyebilen bir derleyiciye ihtiyacınız olduğu anlamına gelir. Bunun nasıl çalışacağından emin değilim.
James Haug

67

Eğer dendiğinde yönetilmeyen , makine özgü, makine düzeyinde kodunu düşünüyorum. X86 montaj dili gibi. Yönetilmeyen (yerel) kod derlenir ve o an için tüm işletim sistemi öğeleri hariç olmak üzere doğrudan tasarlandığı işlemcide çalışacak şekilde bağlanır. Taşınabilir değil, ama hızlı. Çok basit, soyulmuş kod.

Yönetilen kod, Java'dan eski Yorumlayıcı BASIC'e veya .NET altında çalışan her şeye kadar her şeydir. Yönetilen kod tipik olarak orta düzey bir P-Code veya bayt kodu talimat setine derlenir. Montaj diline benzemelerine rağmen, bunlar makineye özgü talimatlar değildir. Yönetilen kod, programı üzerinde çalıştığı makineden yalıtır ve tüm belleğin dolaylı olarak tahsis edildiği güvenli bir sınır oluşturur ve genel olarak konuşursak, bağlantı noktaları, bellek adres alanı, yığın vb. Gibi makine kaynaklarına doğrudan erişiminiz yoktur. Fikir daha güvenli bir ortamda çalışmaktır.

Yönetilen bir değişkenden, örneğin, yönetilmeyen bir değişkene dönüştürmek için, gerçek nesnenin kendisine ulaşmanız gerekir. Muhtemelen bazı ek ambalajlara sarılmış veya kutulanmış. Yönetilmeyen değişkenler ('int' gibi) - 32 bitlik bir makinede - tam olarak 4 bayt alır. Havai veya ek paketleme yoktur. Yönetilen koddan yönetilmeyen koda geçme ve tekrar tekrar " marshaling " denir . Programlarınızın sınırı geçmesine izin verir.


1
Peki, yeniden düzenleme değer ve referans türleri ile nasıl etkileşir? Örneğin MarshalByRefObject hakkında bir şeyler gördüğümü hatırlıyorum.
Kyle Baran

24

Mümkün olduğunca az kelime ile:

  • yönetilen kod = .NET programları
  • yönetilmeyen kod = "normal" programlar

16
.NET programı "normal" değil mi?
jtate

1
@jtate - Bu biraz daldırıyor, evet. :) Daha sezgisel hale getirmeye çalışıyordum. Her neyse, bu 8 yıl önceydi. Bugün ortak günlük kullanımda sayısız programlama dili ile bu ayrım gerçekten daha da kesin değil, evet.
Vilx-

5

Yönetilen kod C # .Net, VB.Net, F # .Net vb derleyicilerin oluşturduğu şeydir. Çöp toplama, referans kontrolü ve çok daha fazlası gibi hizmetler sunan CLR'de çalışır. Bunu düşünün, kodum CLR tarafından yönetiliyor.

Öte yandan, yönetilmeyen kod doğrudan makine kodunu derler. CLR tarafından yönetilmez.


4

Temel olarak yönetilmeyen kod .NET CLR altında çalışmayan koddur (diğer adıyla VB.NET, C # vb.). Benim tahminim NUnit .NET kodu (aka C ++) olmayan bir koşucu / sarıcı var.


4

Yönetilen Kod:
Ortak dil çalışma zamanı ile "işbirliği sözleşmesi" altında çalışan kod. Yönetilen kod, çalışma zamanı için bellek yönetimi, diller arası entegrasyon, kod erişim güvenliği ve nesnelerin otomatik ömür boyu kontrolü gibi hizmetler sağlamak için gereken meta verileri sağlamalıdır. Microsoft ara diline (MSIL) dayalı tüm kodlar yönetilen kod olarak yürütülür.

Yönetilmeyen Kod:
Ortak dil çalışma zamanının kurallarına ve gereksinimlerine bakılmaksızın oluşturulan kod. Yönetilmeyen kod, ortak dil çalışma zamanı ortamında minimum hizmetle yürütülür (örneğin, çöp toplama, sınırlı hata ayıklama vb.).

Referans: http://www.dotnetspider.com/forum/11612-difference-between-managed-and-unmanaged-code.aspx


3

NUnit, birim testlerini ayrı bir AppDomain'e yükler ve giriş noktasının çağrılmadığını (muhtemelen gerekli değildir), bu nedenle giriş düzeneğinin boş olduğunu varsayarım.


2

Yönetilen kod CLR yani .NET çalışma zamanı ortamında çalışır. Kısacası tüm IL yönetilen koddur.Ama üçüncü taraf yazılım örneği VB6 veya VC ++ bileşeni kullanıyorsanız, .NET çalışma zamanı (CLR) kontrolü olmadığından yönetilmeyen kodlardır dilin kaynak kodunun yürütülmesi.


1

Yönetilen Kod: - Dil derleyici derlemesinden sonra MSIL (ara dil) formunun geliştirildiği ve doğrudan CLRyönetilen kodla yürütülen kod. ör.: - .net framework tarafından desteklenen tüm 61 dil kodu

Yönetilmeyen Kod: - Daha önce .netMSIL formunun kullanılamadığı ve CLRdoğrudan çalıştırıldığı CLRkod, işletim sistemine yeniden yönlendirilecek kod, yönetilmeyen kod olarak bilinir.

ör .: -COM, Win32 API'leri


Bu yayında bir takım hatalar var. Açıkçası MISL (MSIL demek istediniz).
Matt Seymour

1
  • Yönetilen Kod: C #, VB.NET gibi .NET dilinde yazılmış kod.
  • Yönetilmeyen Kod: .NET dilinde yazılmayan kod ve MSIL bunun ne olduğunu anlamıyor ve CLR altında çalışamıyor; .NET dillerinde oluşturulmayan .NET uygulamalarımızda kullandığımız üçüncü taraf denetimleri gibi.

0

Her şeyden önce .NET framework, Microsoftdaha önce , benzer ürünler gibi bağımsız ürünler sağlıyordu MFC (Visual C++), VB, FoxPro.

2002 yılında Microsoft ürünlerini birleştirdi ve .NET çerçevesi yaptı. Şimdi kodun daha önce nasıl yürütüldüğü ile kodun .NET framework'te nasıl yönetildiği ve yürütüldüğü arasında bir fark var. Microsoft CLR, .NET framework'ün desteklenen herhangi bir dilinden gelen kodu derleyen ve memory mangement, garbage collectionvb. Gibi ek işlevler sağlayan .NET framework konseptini tanıttı . Ancak, bu tür CLR özellikleri daha önce doğrudan mevcut değildi.

Dolayısıyla, .NET çatısında (CLR ile derlenmiş) kütüphane / kod oluşturuyorsanız, buna denir Managed code. Bu kütüphaneyi diğer .NET uygulamalarında / projelerinde daha fazla kullanabilirsiniz ve orada da CLR daha önce nasıl derlendiğini anlayacaktır ve bu yüzden yönetim kodunuz olarak kalır.

OTOH, .NET framework'ten önce yazılmış kütüphaneleri kullanmak istiyorsanız, belirli sınırlamalarla yapabilirsiniz, ancak unutmayın, CLR o sırada orada olmadığından, şimdi CLR bu kodu tekrar anlamayacak ve derlemeyecektir. . Ve buna çağrılacak unmanaged code. Bazı özellikler / araç sağlamak için bazı üçüncü taraflarca oluşturulan kütüphanelerin / meclislerin de CLR uyumlu değilse yönetim kodu olarak kabul edilebileceğini lütfen unutmayın.

Laymen terimleriyle, Kodu yönet , CLR'nizin anladığı ve daha fazla yürütme için kendi başına derleyebileceği bir şeydir. .NET çerçevesinde, (.NET framework üzerinde çalışan herhangi bir dilden) Kod CLR'ye gittiğinde, kod bazı meta veri bilgilerini sağlar, böylece CLR size burada belirtilen özellikleri sağlayabilir . Bunlardan birkaçı Garbage collection, Performance improvements, cross-language integration, memory managementvb.

OTOH, yönetilmeyen kod makineye özgü ve kullanıma hazır bir şeydir, daha fazla işlemeye gerek yoktur.


Korkarım, bir sürü ve çok fazla bilgisiz görüş. Bu bir sürpriz olabilir, ancak CLR de yönetilmeyen kod (genellikle C ++ / CLI ile yazılmış) yürütebilir. Yönetilen kodun IL olarak kullanılabilir olması da gerekmez. .NET Native bir süredir piyasada ve önceden derlenmiş derlemeler ile geliyor. "CLR uyumlu" olarak adlandırdığınız şey muhtemelen "CLS uyumlu" anlamına gelir . CLS uyumluluğunun sağlanamaması, yönetilen kodu birdenbire yönetmez. Açıklamanıza rağmen yönetilmeyen kod kullanmak da oldukça kolaydır (COM üzerinden RCW, P / Invoke, C ++ / CLI, vb.).
IInspectable

0

Pro C # 5 ve .NET 4.5 Framework'ten:

Yönetilen ve Yönetilmeyen Kod: Belki de C # dili hakkında anlaşılması gereken en önemli nokta, yalnızca .NET çalışma zamanı içinde yürütülebilen kod üretebilmesidir (yerel bir COM sunucusu veya yönetilmeyen bir C / C ++ oluşturmak için asla C # kullanamazsınız. uygulama). Resmi olarak konuşursak, .NET çalışma zamanını hedefleyen kodu tanımlamak için kullanılan terim yönetilen koddur. Yönetilen kodu içeren ikili birim derleme olarak adlandırılır (derlemeler hakkında biraz daha ayrıntılı bilgi). Tersine, doğrudan .NET çalışma zamanı tarafından barındırılamayan koda yönetilmeyen kod adı verilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.