Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Birlikte çalışma yardımcısı, verileri sıralarken kopyalayabilir veya sabitleyebilir. Verilerin kopyalanması, bir bellek konumundaki verilerin bir kopyasını başka bir bellek konumuna yerleştirir. Aşağıdaki çizimde, bir değer türünü kopyalama ile yönetilen bellekten yönetilmeyen belleğe başvuru tarafından geçirilen bir türü kopyalama arasındaki farklar gösterilmektedir.
Değer olarak geçirilen metod bağımsız değişkenleri, yığında yönetilmeyen koda değerler olarak aktarılır. Kopyalama işlemi doğrudan gerçekleştirilir. Referansla geçirilen bağımsız değişkenler, yığında işaretçi olarak iletilir. Başvuru türleri de değerle ve referansla iletilir. Aşağıdaki çizimde gösterildiği gibi, değer ile geçirilen referans türleri ya kopyalanır ya da sabitlenir.
Sabitleme işlemi verileri geçerli bellek konumunda geçici olarak kilitleyerek ortak dil çalışma zamanının çöp toplayıcısı tarafından yeniden yerleştirilmesini engeller. Marshaller, kopyalama ek yükünü azaltmak ve performansı artırmak için verileri sabitler. Verilerin türü, hazırlama işlemi sırasında kopyalanıp kopyalanmadığını veya sabitlenip sabitlenmediğini belirler. Sıralama sırasında String gibi nesneler için sabitleme otomatik olarak gerçekleştirilir, ancak GCHandle sınıfını kullanarak belleği elle de sabitleyebilirsiniz.
Biçimlendirilmiş Blittable Sınıfları
Biçimlendirilmiş blittable sınıfları, hem yönetilen hem de yönetilmeyen bellekte sabit düzen (biçimlendirilmiş) ve ortak veri gösterimine sahiptir. Bu türler sıralama gerektirdiğinde, yığındaki nesneye yönelik bir işaretçi doğrudan çağrıya geçirilir. Çağıran, işaretçi tarafından başvurulmakta olan bellek konumunun içeriğini değiştirebilir.
Uyarı
Parametre Out veya In/Out olarak işaretlenmişse, çağıran bellek içeriğini değiştirebilir. Buna karşılık, parametre biçimlendirilmiş kesilebilir türler için varsayılan olan In olarak ayarlandığında çağıranın içeriği değiştirmekten kaçınması gerekir. In nesnesinin değiştirilmesi, aynı sınıf bir tür kitaplığına aktarıldığında ve daireler arası çağrılar yapmak için kullanıldığında sorun oluşturur.
Biçimlendirilmiş Kesilebilir Olmayan Sınıflar
Biçimlendirilmiş , bölünebilir olmayan sınıfların sabit düzeni (biçimlendirilmiş) vardır, ancak yönetilen ve yönetilmeyen bellekte veri gösterimi farklıdır. Veriler aşağıdaki koşullar altında dönüştürme gerektirebilir:
Bölünebilir olmayan bir sınıf değere göre yapılandırılmışsa, çağıran veri yapısının bir kopyasına yönelik bir işaretçi alır.
Blittable olmayan bir sınıf başvuruya göre yapılandırılmışsa, çağıran veri yapısının bir kopyasına yönelik bir işaretçiyi alır.
InAttribute özniteliği ayarlanmışsa, bu kopya her zaman örneğin durumuyla başlatılır ve gerektiği şekilde serileştirilir.
OutAttribute Özniteliği ayarlanırsa, dönüşte durum her zaman örneğe kopyalanır ve gerektiğinde düzenlenir.
Hem InAttribute hem de OutAttribute ayarlanırsa, her iki kopya da gereklidir. Özniteliklerden biri atlanırsa, marshaller iki kopyayı da ortadan kaldırarak iyileştirebilir.
Başvuru Türleri
Başvuru türleri değere veya başvuruya göre geçirilebilir. Değer olarak geçirildiğinde, yığına türüne yönelik bir işaretçi geçirilir. Başvuru ile geçirildiğinde, yığında türünün işaretçisine bir işaretçi geçirilir.
Başvuru türleri aşağıdaki koşullu davranışa sahiptir:
Bir başvuru türü değere göre geçirilirse ve bölünebilir olmayan türlerin üyelerine sahipse, türler iki kez dönüştürülür:
Yönetilmeyen tarafa bir bağımsız değişken geçirildiğinde.
Çağrı dönüşünde.
Gereksiz yere kopyalanıp dönüştürülmemesi için, bu türler In parametreleri olarak sıralanır. Çağıranın, çağrılanın yaptığı değişiklikleri görebilmesi için bağımsız değişkene InAttribute ve OutAttribute özniteliklerini açıkça uygulamanız gerekir.
Bir başvuru türü değere göre geçirilirse ve yalnızca blittable türlerinin üyelerine sahipse, sıralama sırasında sabitlenebilir ve arayan tarafından türün üyelerinde yapılan değişiklikler çağıran tarafından görülür. Bu davranışı istiyorsanız InAttribute ve OutAttribute'u açıkça uygulayın. Bu yönlü öznitelikler olmadan, interop marshaller yönlü bilgileri tür kitaplığına ihraç etmez (varsayılan olarak In şeklinde ihraç edilir) ve bu durum COM bölümler arası marshalllama ile ilgili sorunlara neden olabilir.
Referans türü, referans ile iletilirse, varsayılan olarak In/Out olarak düzenlenir.
System.String ve System.Text.StringBuilder
Veriler değere veya başvuruya göre yönetilmemiş koda aktarılırken, sıralayıcı genellikle verileri ikincil bir arabelleğe kopyalar (bu esnada karakter kümelerini dönüştürebilir) ve sonrasında arabelleğe bir başvuru aktarır. Başvuru SysAllocString ile ayrılmış bir BSTR değilse, başvuru her zaman CoTaskMemAlloc ile ayrılır.
Bir iyileştirme olarak, String veya StringBuilder değere göre iletildiğinde (örneğin, bir Unicode karakter dizisi), marshaller çağrı yapılan tarafa yeni bir arabelleğe kopyalamak yerine iç Unicode arabelleğindeki yönetilen dizelere doğrudan bir işaretçi iletir.
Dikkat
Bir dize değere göre geçirildiğinde, çağıran hiçbir zaman marshaller tarafından geçirilen başvuruyu değiştirmemelidir. Bunu yapmak yönetilen yığını bozabilir.
bir System.String başvuruyla geçirildiğinde, marshaller çağrıyı yapana kadar dizenin içeriğini ikincil arabelleğe kopyalar. Ardından, arabelleğin içeriğini çağrıdan döndükten sonra yeni bir dizeye kopyalar. Bu teknik sabit yönetilen dizenin değişmeden kalmasını sağlar.
Bir System.Text.StringBuilder değer olarak geçirildiğinde, marshaller, StringBuilder'ın iç arabelleğinin geçici bir kopyasına bir başvuruyu çağırana iletir. Arayan ve arananın arabelleğin boyutuna karar vermesi gerekir. Çağıran, yeterli uzunlukta bir StringBuilder oluşturmakla sorumludur. Çağrılanın, arabelleğin taşmadığından emin olmak için gerekli önlemleri alması gerekir.
StringBuilder, değer olarak geçirilen başvuru türlerinin varsayılan olarak In
parametre olarak geçilmesi kuralının bir istisnasıdır.
StringBuilder
her zaman olarak In
/Out
geçirilir.