Yönetilen/Yönetilmeyen Kod Birlikte Çalışabilirliğine Genel Bakış

 

Sonja Keserovic, Program Yöneticisi
David Mortenson, Baş Yazılım Tasarım Mühendisi
Adam Nathan, Testte Baş Yazılım Tasarım Mühendisi

Microsoft Corporation

Ekim 2003

Aşağıdakiler cihazlar için geçerlidir:
   Microsoft® .NET Framework
   COM Birlikte Çalışma

Özet: Bu makalede, yönetilen ve yönetilmeyen kod arasında birlikte çalışabilirlik hakkında temel bilgiler ve yönetilen koddan yönetilmeyen API'ye erişmeye ve bunları sarmamaya ve yönetilen API'leri yönetilmeyen arayanlara kullanıma sunmaya yönelik yönergeler ve yaygın uygulamalar sağlanır. Güvenlik ve güvenilirlik konuları, performans verileri ve geliştirme süreçlerine yönelik genel uygulamalar da vurgulanır. (14 yazdırılan sayfa)

Önkoşullar: Bu belgenin hedef kitlesi, yönetilen kodun nerede kullanılacağı hakkında üst düzey kararlar alınması gereken geliştiricileri ve yöneticileri içerir. Bunu yapmak için, yönetilen ve yönetilmeyen kod arasındaki etkileşimin nasıl çalıştığını ve geçerli yönergelerin belirli senaryolar için nasıl geçerli olduğunu anlamak yararlı olur.

İçindekiler

Birlikte Çalışabilirliğe Giriş
Birlikte Çalışabilirlik Yönergeleri
Güvenlik
Güvenilirlik
Performans
Ek 1: Birlikte Çalışabilirlik Sınırını Aşma
Ek 2: Kaynaklar
Ek 3: Terimler Sözlüğü

Birlikte Çalışabilirliğe Giriş

Ortak dil çalışma zamanı (CLR), yönetilen kodun COM bileşenleri, COM+ hizmetleri, Win32® API'si ve diğer yönetilmeyen kod türleriyle etkileşimini teşvik eder. Veri türleri, hata işleme mekanizmaları, oluşturma ve yok etme kuralları ve tasarım yönergeleri yönetilen ve yönetilmeyen nesne modelleri arasında farklılık gösterir. Yönetilen ve yönetilmeyen kod arasındaki birlikte çalışma sürecini basitleştirmek ve geçiş yolunu kolaylaştırmak için CLR birlikte çalışma katmanı, hem istemcilerden hem de sunuculardan bu nesne modelleri arasındaki farkları gizler.

Birlikte çalışabilirlik ("birlikte çalışma") çift yönlüdür ve bu da şunları mümkün kılar:

  • Yönetilen koddan yönetilmeyen API'lere çağrı

    Bu, hem düz API'ler (kernel32.dll ve user32.dll gibi DLL'lerden kullanıma sunulan Win32 API'leri gibi statik DLL dışarı aktarmaları) hem de COM API'leri (Microsoft® Word, Excel, Internet Explorer, ActiveX® Veri Nesneleri (ADO) vb. tarafından kullanıma sunulan nesne modelleri) için yapılabilir.

  • Yönetilen API'leri yönetilmeyen koda sunma

    Bunu yapmaya örnek olarak Windows Media® Player gibi COM tabanlı bir uygulama için eklenti oluşturma veya MFC formuna yönetilen Windows Forms denetimi ekleme verilebilir.

Üç tamamlayıcı teknoloji, bu yönetilen/yönetilmeyen etkileşimleri etkinleştirir:

  • Platform Invoke (bazen P/Invoke olarak da adlandırılır), imzası yönetilen kaynak kodunda yeniden işlendiği sürece herhangi bir işlevin yönetilmeyen herhangi bir dilde çağrılmalarına olanak tanır. Bu, Visual Basic® 6.0'daki deyimi tarafından Declare sağlanan işlevlere benzer.
  • COM birlikte çalışma, herhangi bir yönetilen dilde COM bileşenlerine normal yönetilen bileşenleri kullanmaya benzer şekilde çağrılmayı sağlar ve bunun tersi de geçerlidir. COM birlikte çalışma, CLR tarafından sağlanan temel hizmetlerin yanı sıra System.Runtime.InteropServices ad alanında bulunan bazı araçlardan ve API'lerden oluşur.
  • C++ birlikte çalışması (bazen It Just Works (IJW) olarak da adlandırılır), düz API'lerin ve COM API'lerinin her zaman kullanıldığı gibi doğrudan kullanılmasını sağlayan C++'a özgü bir özelliktir. Bu, COM birlikte çalışmasından daha güçlüdür, ancak çok daha fazla bakım gerektirir. Bu teknolojiyi kullanmadan önce C++ kaynaklarını denetlediğinizden emin olun.

Birlikte Çalışabilirlik Yönergeleri

Yönetilen Koddan Yönetilmeyen API'leri Çağırma

Çeşitli yönetilmeyen API türleri ve bunlara çağrılabilecek çeşitli birlikte çalışma teknolojileri vardır. Bu teknolojilerin nasıl ve ne zaman kullanılacağına ilişkin öneriler bu bölümde açıklanmıştır. Bu önerilerin çok genel olduğunu ve tüm senaryoları kapsamadığını lütfen unutmayın. Senaryolarınızı dikkatle değerlendirmeli ve senaryonuz için anlamlı geliştirme uygulamaları ve/veya çözümleri uygulamalısınız.

Yönetilmeyen Düz API'leri Çağırma

Yönetilen koddan yönetilmeyen düz API'lere çağrıda bulunmaya yönelik iki mekanizma vardır: Platform Çağırma (tüm yönetilen dillerde kullanılabilir) veya C++ birlikte çalışma (C++'da kullanılabilir).

Bu birlikte çalışma teknolojilerinden birini kullanarak düz BIR API çağırmaya karar vermeden önce, .NET Framework eşdeğer işlevsellik olup olmadığını belirlemeniz gerekir. Mümkün olduğunda yönetilmeyen API'leri çağırmak yerine .NET Framework işlevselliği kullanmanız önerilir.

Yalnızca birkaç yönetilmeyen yöntemi çağırmak veya basit düz API'leri çağırmak için öneri, C++ birlikte çalışma yerine platform çağırmayı kullanmaktır. Basit düz API'ler için platform çağırma bildirimleri yazmak basittir. CLR, DLL yükleme ve tüm parametre hazırlama adımlarını üstlenir. Karmaşık düz API'ler için birkaç platform çağırma bildirimi yazma çalışmaları bile, C++ birlikte çalışmasını kullanma ve C++ ile yazılmış yepyeni bir modül sunma maliyetiyle karşılaştırıldığında göz ardı edilebilir.

Karmaşık yönetilmeyen düz API'leri sarmalama veya yönetilen kod geliştirme aşamasındayken değişen yönetilmeyen düz API'leri sarmalama için, platform çağrısı yerine C++ birlikte çalışma kullanılması önerilir. C++ katmanı çok ince olabilir ve yönetilen kodun geri kalanı başka bir yönetilen dilde yazılabilir. Bu senaryolarda platform çağrısı kullanmak, yönetilen kodda API'nin karmaşık bölümlerini yeniden bildirmek ve yönetilmeyen API'lerle eşitlenmiş durumda tutmak için çok fazla çaba gerektirir. C++ birlikte çalışması kullanmak, yönetilmeyen API'lere doğrudan erişime izin vererek bu sorunu çözer; bu da yeniden yazma gerektirmez, yalnızca bir üst bilgi dosyasının eklenmesini gerektirir.

COM API'lerini çağırma

Yönetilen koddan COM bileşenlerini çağırmanın iki yolu vardır: COM birlikte çalışma (tüm yönetilen dillerde kullanılabilir) veya C++ birlikte çalışma (C++'da kullanılabilir).

OLE Otomasyonu uyumlu COM bileşenlerini çağırmak için, COM birlikte çalışma özelliğinin kullanılması önerilmektedir. CLR, COM bileşeni etkinleştirme ve parametre hazırlama ile ilgilenir.

Arabirim Tanım Dili'ne (IDL) göre COM bileşenlerini çağırmak için C++ birlikte çalışma kullanılması önerisinde bulunuluyor. C++ katmanı çok ince olabilir ve yönetilen kodun geri kalanı herhangi bir yönetilen dilde yazılabilir. COM birlikte çalışma, doğru birlikte çalışma çağrıları yapmak için tür kitaplıklarındaki bilgilere dayanır, ancak tür kitaplıkları genellikle IDL dosyalarında bulunan tüm bilgileri içermez. C++ birlikte çalışma kullanmak, bu COM API'lerine doğrudan erişime izin vererek bu sorunu çözer.

Zaten gönderilmiş OLAN COM API'lerine sahip şirketler için, bu API'ler için birincil birlikte çalışma derlemelerini (PIA) göndermeyi göz önünde bulundurmak önemlidir, böylece yönetilen istemciler için kullanımı kolaydır.

Yönetilmeyen API'leri Çağırmak için Karar Ağacı

Şekil 1. Yönetilmeyen API'leri çağırma karar ağacı

Yönetilen API'leri Yönetilmeyen Koda Açma

Yönetilen API'yi yalnızca yönetilmeyen arayanlara göstermenin iki ana yolu vardır: COM API'si veya düz API olarak. Visual Studio® .NET ile kodlarını yeniden derlemeye istekli olan C++ yönetilmeyen istemciler için üçüncü bir seçenek vardır: C++ birlikte çalışma aracılığıyla yönetilen işlevlere doğrudan erişme. Bu seçeneklerin nasıl ve ne zaman kullanılacağına ilişkin öneriler bu bölümde açıklanmıştır.

Yönetilen API'ye Doğrudan Erişme

Yönetilmeyen bir istemci C++ dilinde yazılmışsa, Visual Studio .NET C++ derleyicisi ile "karma mod görüntüsü" olarak derlenebilir. Bu yapıldıktan sonra yönetilmeyen istemci, yönetilen herhangi bir API'ye doğrudan erişebilir. Ancak bazı kodlama kuralları yönetilmeyen koddan yönetilen nesnelere erişmek için geçerlidir; Daha fazla ayrıntı için C++ belgelerine bakın.

Yönetilen API geliştiricileri tarafından dikkate alınması gerekmediğinden doğrudan erişim tercih edilen seçenektir. Yönetilen API'lerini yönetilen API tasarım yönergelerine (DG) göre tasarlayabilir ve API'nin yönetilmeyen arayanlar tarafından erişilebilir olmaya devam edeceğinden emin olabilirler.

Yönetilen API'yi COM API'si olarak gösterme

Her genel yönetilen sınıf, COM birlikte çalışma aracılığıyla yönetilmeyen istemcilere gösterilebilir. COM birlikte çalışma katmanı tüm COM tesisatını üstlendiği için bu işlemin uygulanması çok kolaydır. Bu nedenle, örneğin her yönetilen sınıf IUnknown, IDispatch, ISupportErrorInfo ve diğer birkaç standart COM arabirimini uygular.

Yönetilen API'leri COM API'leri olarak göstermenin kolay olmasına rağmen, yönetilen ve COM nesne modelleri çok farklıdır. Bu nedenle, yönetilen API'yi COM'a ifşa etmek her zaman açık bir tasarım kararı olmalıdır. Yönetilen dünyada kullanılabilen bazı özelliklerin COM dünyasında eşdeğeri yoktur ve COM istemcilerinden kullanılamaz. Bu nedenle, yönetilen API tasarım yönergeleri (DG) ile COM ile uyumluluk arasında genellikle bir gerilim vardır.

COM istemcileri önemliyse yönetilen API'nizi yönetilen API tasarım yönergelerine göre yazın ve ardından yönetilen API'nizin çevresine COM'a açık olacak ince bir COM dostu yönetilen sarmalayıcı yazın.

Yönetilen API'yi Düz API olarak ortaya çıkarma

Bazen yönetilmeyen istemciler COM kullanamaz. Örneğin, düz API'leri kullanmak için zaten yazılmış olabilir ve değiştirilemez veya yeniden derlenemezler. C++ yönetilen API'leri düz API'ler olarak kullanıma sunmanızı sağlayan tek üst düzey dildir. Bunu yapmak, yönetilen API'yi COM API'sini ortaya çıkarmak kadar kolay değildir. C++ birlikte çalışması ve yönetilen ve yönetilmeyen dünyalar arasındaki farklar hakkında ileri düzeyde bilgi gerektiren çok gelişmiş bir tekniktir.

Yönetilen API'nizi yalnızca kesinlikle gerekliyse düz BIR API olarak kullanıma sunma. Başka seçeneğiniz yoksa C++ belgelerine göz atmayı ve tüm sınırlamaları tam olarak bildiğinden emin olun.

Yönetilen API'leri Kullanıma Çıkarmak için Karar Ağacı

Şekil 2. Yönetilen API'leri açığa çıkarma karar ağacı

Güvenlik

Ortak dil çalışma zamanı, bir derlemenin kaynağı hakkındaki bilgilere göre korunan kaynaklara erişimi düzenleyen bir güvenlik sistemi olan Code Access Security (CAS) ile birlikte gönderilir. Yönetilmeyen kodu çağırmak büyük bir güvenlik riski oluşturur. Uygun güvenlik denetimleri olmadan, yönetilmeyen kod CLR işlemindeki herhangi bir yönetilen uygulamanın durumunu işleyebilecektir. Yönetilmeyen koddaki kaynakları, bu kaynaklar herhangi bir CAS izin denetimine tabi olmadan doğrudan çağırmak da mümkündür. Bu nedenle, yönetilmeyen koda yapılan tüm geçişler yüksek korumalı bir işlem olarak kabul edilir ve bir güvenlik denetimi içermelidir. Bu güvenlik denetimi, yönetilmeyen kod geçişini içeren derlemenin yanı sıra onu çağıran tüm derlemelerin gerçekten yönetilmeyen kodu çağırma hakkına sahip olmasını gerektiren yönetilmeyen kod iznini arar.

Tam güvenlik denetimlerinin gereksiz olduğu ve bileşenin performansını veya kapsamını gereksiz yere sınırladığı bazı sınırlı birlikte çalışma senaryoları vardır. Yönetilmeyen koddan kullanıma sunulan bir kaynağın güvenlik ilgisi yoksa (sistem saati, pencere koordinatları vb.) veya kaynak yalnızca derlemede dahili olarak kullanılıyorsa ve rastgele arayanlara genel olarak gösterilmiyorsa bu durum geçerlidir. Bu gibi durumlarda, ilgili API'lerin tüm çağıranlarında yönetilmeyen kod izni için tam güvenlik denetimini gizleyebilirsiniz. Bunu, suppressUnmanagedCodeSecurity özel özniteliğini ilgili birlikte çalışma yöntemine veya sınıfına uygulayarak yaparsınız. Bunun, kısmen güvenilen hiçbir kodun bu TÜR API'lerden yararlanamadığını saptadığınız dikkatli bir güvenlik gözden geçirmesi varsaydığını unutmayın.

Güvenilirlik

Yönetilen kod, yönetilmeyen koddan daha güvenilir ve sağlam olacak şekilde tasarlanmıştır. Bu özellikleri destekleyen bir CLR özelliğine örnek olarak, bellek sızıntılarını önlemek için kullanılmayan belleği boşaltmayı sağlayan çöp toplama işlemi gösteriliyor. Başka bir örnek, arabellek taşması hatalarını ve türle ilgili diğer hataları önlemek için kullanılan yönetilen tür güvenliğidir.

Herhangi bir birlikte çalışma teknolojisi kullandığınızda kodunuz saf yönetilen kod kadar güvenilir veya sağlam olmayabilir. Örneğin, yönetilmeyen belleği el ile ayırmanız ve işiniz bittiğinde boşaltmayı unutmamanız gerekebilir.

Önemsiz olmayan birlikte çalışma kodları yazmak, yönetilmeyen kod yazmayla aynı güvenilirlik ve sağlamlığa dikkat gerektirir. Tüm birlikte çalışma kodları doğru yazıldığında bile sisteminiz yalnızca yönetilmeyen parçaları kadar güvenilir olacaktır.

Performans

Yönetilen koddan yönetilmeyen koda (ve tam tersi) yapılan her geçişte bazı performans ek yükü vardır. Ek yük miktarı, kullanılan parametre türlerine bağlıdır. CLR birlikte çalışma katmanı, geçiş türüne ve parametre türlerine göre üç birlikte çalışma çağrısı iyileştirme düzeyi kullanır: tam zamanında (JIT) satır içi, derlenmiş derleme saplamaları ve yorumlanmış hazırlama saptamaları (en hızlıdan en yavaşa çağrı türüne sırasıyla).

Platform çağırma çağrısı için yaklaşık ek yük: 10 makine yönergesi (x86 işlemcide)

COM birlikte çalışma çağrısı için yaklaşık ek yük: 50 makine yönergesi (x86 işlemcide)

Bu yönergelerle yapılan iş, Düz API Çağırma: Adım Adım ve COM API'sini Çağırma: Adım Adım ek bölümlerinde gösterilir. Atık toplayıcının çağrı sırasında yönetilmeyen iş parçacıklarını engellememesini ve çağrı kurallarını ve yönetilmeyen özel durumları işlemesini sağlamanın yanı sıra, COM birlikte çalışması geçerli çalışma zamanı çağrılabilen sarmalayıcıdaki (RCW) çağrıyı geçerli bağlama uygun bir COM arabirim işaretçisine dönüştürmek için ek iş yapar.

Her birlikte çalışma çağrısı bazı ek yük getirir. Bu çağrıların ne sıklıkta gerçekleştiğine ve yöntem uygulamasında gerçekleşen işin önemine bağlı olarak, çağrı başına ek yük göz ardı edilebilirden çok fark edilebilire kadar değişebilir.

Bu noktalara bağlı olarak, aşağıdaki listede yararlı bulabileceğiniz bazı genel performans önerileri sağlanır:

  • Yönetilen ve yönetilmeyen kod arasındaki arabirimi denetlerseniz, yapılan toplam geçiş sayısını azaltmak için "gevezli" yerine "öbekli" yapın.

    Gevezli arabirimler, birlikte çalışma sınırının diğer tarafında önemli bir çalışma yapmadan çok sayıda geçiş yapan arabirimlerdir. Örneğin, özellik ayarlayıcıları ve getter'lar gevezli olur. Öbekli arabirimler yalnızca birkaç geçiş yapabilen arabirimlerdir ve sınırın diğer tarafında yapılan iş miktarı önemlidir. Örneğin, veritabanı bağlantısını açan ve bazı verileri alan bir yöntem öbek şeklindedir. Öbekli arabirimler daha az birlikte çalışma geçişi içerdiği için bazı performans ek yüklerini ortadan kaldırırsınız.

  • Mümkünse Unicode/ANSI dönüştürmelerinden kaçının.

    Dizeleri Unicode'dan ANSI'ye ve tam tersi olarak dönüştürmek pahalı bir işlemdir. Örneğin, dizelerin geçirilmesi gerekiyorsa ancak içeriği önemli değilse, bir dize parametresini IntPtr olarak bildirebilirsiniz ve birlikte çalışma sıralayıcısı herhangi bir dönüştürme yapmaz.

  • Yüksek performanslı senaryolar için, parametrelerin ve alanların IntPtr olarak bildirilmesi, kullanım kolaylığı ve bakım pahasına da olsa performansı artırabilir.

    Bazen, varsayılan birlikte çalışma sıralamasını kullanmak yerine Hazırlama sınıfında kullanılabilen yöntemleri kullanarak el ile sıralama yapmak daha hızlıdır. Örneğin, bir birlikte çalışma sınırında büyük dize dizilerinin geçirilmesi gerekiyorsa, ancak yalnızca birkaç öğe gerekiyorsa, diziyi IntPtr olarak bildirmek ve yalnızca birkaç öğeye el ile erişmek çok daha hızlı olacaktır.

  • Gereksiz hazırlamayı azaltmak için InAttribute ve OutAttribute'u akıllıca kullanın.

    Birlikte çalışma sıralayıcısı, belirli bir parametrenin çağrıdan önce içinde sıralanması ve çağrıdan sonra sıralanması gerekip gerekmediğini belirlerken varsayılan kuralları kullanır. Bu kurallar, dolaylılık düzeyine ve parametre türüne bağlıdır. Yöntemin semantiğine bağlı olarak bu işlemlerden bazıları gerekli olmayabilir.

  • Platformda SetLastError=false kullanın, ancak daha sonra Marshal.GetLastWin32Error'ı çağıracaksanız imzaları çağırabilirsiniz.

    Platform çağırma imzalarında SetLastError=true ayarının yapılması, son hata kodunu korumak için birlikte çalışma katmanından ek çalışma gerektirir. Bu özelliği yalnızca bu bilgilere güvendiğinizde kullanın ve aramayı yaptıktan sonra bu bilgileri kullanın.

  • Yönetilmeyen çağrılar yalnızca kötüye kullanılamayan bir şekilde gösteriliyorsa, güvenlik denetimlerinin sayısını azaltmak için SuppressUnmanagedCodeSecurityAttribute kullanın.

    Güvenlik denetimleri çok önemlidir. API'niz hiçbir korumalı kaynağı veya hassas bilgiyi kullanıma sunmazsa veya bunlar iyi korunuyorsa, kapsamlı güvenlik denetimleri gereksiz ek yüke neden olabilir. Ancak, herhangi bir güvenlik denetimi yapmamanın maliyeti çok yüksektir.

Ek 1: Birlikte Çalışabilirlik Sınırını Geçme

Düz API Çağırma: Adım Adım

Şekil 3. Düz API çağırma

  1. LoadLibrary ve GetProcAddress'i alın.
  2. Hedef adresi içeren imzadan bir DllImport saplaması oluşturun.
  3. Arayan tarafından kaydedilen yazmaçları gönderme.
  4. DllImport çerçevesini ayarlayın ve çerçeve yığınına itin.
  5. Geçici bellek ayrılırsa, çağrı tamamlandığında hızlı boşaltma için bir temizleme listesi başlatın.
  6. Hazırlama parametreleri. (Bu işlem bellek ayırabilir.)
  7. Çöp Toplama modunu kooperatiften preemptive'e dönüştürerek herhangi bir zamanda Çöp Toplama işleminin gerçekleşebilmesini sağlayın.
  8. Hedef adresi yükleyin ve çağırın.
  9. SetLastError biti ayarlandıysa GetLastError'ı çağırın ve sonucu İş Parçacığı Yerel Depolama alanında depolanan bir iş parçacığı soyutlamasında depolayın.
  10. İşbirlikçi Çöp Toplama moduna geri dönün.
  11. PreserveSig=false ise ve yöntem hresult hatası döndürdüyse, bir özel durum oluşturun.
  12. Özel durum oluşturmadıysa , ve başv parametrelerine geri yayma.
  13. Çağıran tarafından açılan bağımsız değişkenleri hesaba eklemek için Genişletilmiş Yığın İşaretçisi'ni özgün değerine geri yükleyin.

COM API'lerini Çağırma: Adım Adım

Şekil 4. COM API'lerini çağırma

  1. İmzadan yönetilenden yönetilmeyene saplama oluşturun.
  2. Arayan tarafından kaydedilen yazmaçları gönderme.
  3. Yönetilenden yönetilmeyene COM Birlikte Çalışma çerçevesi ayarlayın ve çerçeve yığınına itin.
  4. Geçiş sırasında kullanılan geçici veriler için yer ayırın.
  5. Geçici bellek ayrılırsa, çağrı tamamlandığında hızlı boşaltma için bir temizleme listesi başlatın.
  6. Kayan nokta özel durum bayraklarını temizleyin (yalnızca x86).
  7. Hazırlama parametreleri. (Bu işlem bellek ayırabilir.)
  8. Çalışma Zamanı Çağrılabilen Sarmalayıcı içindeki geçerli bağlam için doğru arabirim işaretçisini alın. Önbelleğe alınan işaretçi kullanılamıyorsa, almak için COM bileşeninde QueryInterface'i çağırın.
  9. Çöp Toplama modunu kooperatiften preemptive'e dönüştürerek herhangi bir zamanda Çöp Toplama işleminin gerçekleşebilmesini sağlayın.
  10. Vtable işaretçisinden yuva numarasına göre dizin oluşturun, hedef adresi alın ve çağırın.
  11. QueryInterface daha önce çağrıldıysa arabirim işaretçisinde Release'ı çağırın.
  12. İşbirlikçi Çöp Toplama moduna geri dönün.
  13. İmza PreserveSig olarak işaretlenmemişse, HRESULT hatası olup olmadığını denetleyin ve bir özel durum ( IErrorInfo bilgileriyle dolu olabilir) atın.
  14. Özel durum oluşturmadıysa , ve başv parametrelerine geri yayma.
  15. Çağıran tarafından açılan bağımsız değişkenleri hesaba eklemek için Genişletilmiş Yığın İşaretçisi'ni özgün değere geri yükleyin.

COM'dan Yönetilen API Çağırma: Adım Adım

Şekil 5. COM'dan Yönetilen API çağırma

  1. İmzadan yönetilmeyenden yönetilene saplama oluşturun.
  2. Arayan tarafından kaydedilen yazmaçları gönderme.
  3. Yönetilmeyen ve yönetilen bir COM Birlikte Çalışma çerçevesi ayarlayın ve çerçeve yığınına itin.
  4. Geçiş sırasında kullanılan geçici veriler için yer ayırın.
  5. Çöp Toplama modunu işbirliğinden önleyiciye dönüştürerek çöp toplamanın herhangi bir zamanda gerçekleşmesini sağlayın.
  6. Arabirim işaretçisinden COM çağrılabilen sarmalayıcıyı (CCW) alın.
  7. CCW içindeki yönetilen nesneyi alın.
  8. Gerekirse geçiş uygulama etki alanları.
  9. Bir uygulama etki alanı tam güvene sahip değilse, yöntemin hedef uygulama etki alanına karşı sahip olabileceği bağlantı taleplerini gerçekleştirin.
  10. Geçici bellek ayrılırsa, çağrı tamamlandığında hızlı boşaltma için bir temizleme listesi başlatın.
  11. Hazırlama parametreleri. (Bu işlem bellek ayırabilir.)
  12. Çağrılacak hedef tarafından yönetilen yöntemi bulun. (Bu, arabirim çağrılarını hedef uygulamaya eşlemeyi içerir.)
  13. Dönüş değerini önbelleğe alın. (Kayan nokta dönüş değeriyse, kayan nokta yazmaçtan alın.)
  14. İşbirliği yapılan Çöp Toplama moduna geri dönün.
  15. Bir özel durum oluşturulduysa, döndürülecek HRESULT değerini ayıklayın ve SetErrorInfo öğesini çağırin.
  16. Özel durum oluşturmadıysa , ve başv parametrelerine geri yayma.
  17. Arayan tarafından açılan bağımsız değişkenleri hesaba eklemek için Genişletilmiş Yığın İşaretçisi'ni özgün değere geri yükleyin.

Ek 2: Kaynaklar

Okunması gerekiyor!.NET ve COM: Adam Nathan'ın Eksiksiz Birlikte Çalışabilirlik Kılavuzu

Yönetilmeyen Kodla Birlikte Çalışma, Microsoft .NET Framework Geliştirici Kılavuzu

Birlikte çalışma örnekleri, Microsoft .NET Framework

Adam Nathan'ın blogu

Chris Brumme'un blogu

Ek 3: Terimler Sözlüğü

AppDomain (Uygulama Etki Alanı) Bir uygulama etki alanı, basit bir işletim sistemi işlemine benzer olarak kabul edilebilir ve ortak dil çalışma zamanı tarafından yönetilir.
CCW (COM çağrılabilen sarmalayıcı) COM kodundan etkinleştirilmiş yönetilen nesnelerin çevresinde CLR birlikte çalışma katmanı tarafından oluşturulan özel bir sarmalayıcı türü. CCW, veri hazırlama, yaşam süresi yönetimi, kimlik yönetimi, hata işleme, doğru daire ve iş parçacığı geçişleri vb. sağlayarak yönetilen ve COM nesne modelleri arasındaki farkları gizler. CCW'ler, yönetilen kod uygulayıcısının COM tesisatı hakkında herhangi bir şey bilmesine gerek kalmadan, yönetilen nesne işlevselliğini COM dostu bir şekilde kullanıma sunar.
CLR Ortak dil çalışma zamanı.
COM birlikte çalışma YÖNETILEN koddan COM API'lerini kullanmak veya yönetilen API'leri COM API'leri olarak yönetilmeyen istemcilere ifşa etmek için CLR birlikte çalışma katmanı tarafından sağlanan hizmet. COM birlikte çalışma tüm yönetilen dillerde kullanılabilir.
C++ birlikte çalışma C++ dil derleyicisi ve CLR tarafından sağlanan hizmet, yönetilen ve yönetilmeyen kodu aynı yürütülebilir dosyada doğrudan karıştırmak için kullanılır. C++ birlikte çalışma genellikle yönetilmeyen API'lere üst bilgi dosyalarını dahil etmeyi ve belirli kodlama kurallarını izlemeyi içerir.
Karmaşık düz API Yönetilen dilde bildirmesi zor imzaları olan API'ler. Örneğin, yönetilen tür sisteminde eşdeğer bir kavram olmadığından değişken boyut yapısı parametrelerine sahip yöntemlerin bildirilme zorluğu vardır.
Interop Yönetilen ve yönetilmeyen kod ("yerel" olarak da adlandırılır) arasındaki her türlü birlikte çalışabilirliği kapsayan genel terim. Birlikte çalışma, CLR tarafından sağlanan birçok hizmetlerden biridir.
Birlikte çalışma derlemesi Bir tür kitaplığında yer alan COM türleri için yönetilen tür eşdeğerlerini içeren özel bir yönetilen derleme türü. Genellikle tür kitaplığında Tür Kitaplığı İçeri Aktarıcı aracı (Tlbimp.exe) çalıştırılarak üretilir.
Yönetilen kod CLR denetimi altında yürütülen kod yönetilen kod olarak adlandırılır. Örneğin, C# veya Visual Basic .NET ile yazılmış tüm kodlar yönetilen koddur.
Platform Çağırma Yönetilen koddan yönetilmeyen düz API'leri çağırmak için CLR birlikte çalışma katmanı tarafından sağlanan hizmet. Platform çağırma tüm yönetilen dillerde kullanılabilir.
RCW (çalışma zamanı çağrılabilen wapper) Yönetilen koddan etkinleştirilen COM nesnelerinin çevresinde CLR birlikte çalışma katmanı tarafından oluşturulan özel bir sarmalayıcı türü. RCW, veri hazırlama, yaşam süresi yönetimi, kimlik yönetimi, hata işleme, doğru daire ve iş parçacığı geçişleri vb. sağlayarak yönetilen ve COM nesne modelleri arasındaki farkları gizler.
Yönetilmeyen kod CLR dışında çalışan koda "yönetilmeyen kod" denir. COM bileşenleri, ActiveX bileşenleri ve Win32 API işlevleri yönetilmeyen kod örnekleridir.