Marshaling - nedir ve neden ihtiyacımız var?


95

Marshalling nedir ve neden buna ihtiyacımız var?

intC #'dan C'ye bir telin üzerinden bir yol gönderemeyeceğime ve onu sıralamak zorunda olduğuma inanmakta zorlanıyorum . C # neden 32 biti bir başlangıç ​​ve bitiş sinyaliyle gönderemiyor ve C koduna bir aldığını söylüyor int?

Neden sıralamaya ihtiyacımız olduğuna ve nasıl kullanılacağına dair iyi öğreticiler veya siteler varsa, bu harika olurdu.


3
Aslında, olabilir sadece bir başlangıç ve sonlandırma sinyali ile üzerinde 32 bit gönderin. Bu bir int için kendi marşallamanızı yazmak olurdu. Ama bir Dictionary <CustomClassA, List <CustomClassB>> C koduna nasıl geçirilir?
Vinko Vrsalovic

4
"Telin üzerinden" deyince aşk akla geliyor.
user7116

true, büyük / küçük Endian veya diğer varyasyonları göz ardı edelim.

57
Bu biraz tuhaf bir soru. Bu daha ziyade, "mektup taşıyıcılarının yazışmaları toplayıp sıralama için merkezi konumlara götürdükleri ve daha sonra muhataplara teslim ettikleri bir sistemimiz varken neden bir posta sistemine ihtiyacımız var?" Ama ... bu bir posta sistemi. Onun yerine bir marşaling sistemine sahip olabileceğimiz halde neden bir marşaling sistemine ihtiyacımız olduğunu soruyorsunuz. Sanırım sorunun amacını kaçırıyorum. Açıklayabilir misin?
Eric Lippert

1
Sanırım bunu anlamanın en iyi yolu, montajda "yöntemlerin" nasıl çalıştığını anlamaktır - son komut adresinin yığına nasıl kaydedildiği, parametreler yığından nasıl geçirildiğini, yığın işaretçisi kaydı yöntem tarafından değiştirildi, komut işaretçisi kayıt kullanılır ve özellikle, yöntemlerin uygulanması için farklı tekniklerde küçük değişikliklerin nasıl olabileceği. Aslında, "teli" anlamak, sorunuza biraz ışık tutmalıdır.
ylax

Yanıtlar:


78

Çünkü farklı diller ve ortamlar farklı arama kurallarına, farklı düzen kurallarına, farklı boyutlarda ilkellere (cf. charC # ve charC'de), farklı nesne yaratma / yok etme kurallarına ve farklı tasarım kurallarına sahiptir. Eşyaları yönetilen araziden çıkarmanın ve yönetilmeyen arazinin onu görebileceği ve anlayabileceği bir yere götürmenin bir yoluna ihtiyacınız var ve bunun tersi de geçerlidir. Marshalling bunun için.


26

.NET kodu (C #, VB), CLR ( Common Language Runtime ) tarafından "yönetildiği" için "yönetilen" olarak adlandırılır.

C veya C ++ veya assembler ile kod yazarsanız, CLR dahil olmadığından hepsine "yönetilmeyen" denir. Tüm bellek ayırma / ayırma işlemlerinden siz sorumlusunuz.

Sıralama , yönetilen kod ile yönetilmeyen kod arasındaki süreçtir; CLR'nin sunduğu en önemli hizmetlerden biridir .


11

Sıralandırma an intideal olarak tam olarak söylediğiniz şeydir: Belleği CLR'nin yönetilen yığınından C kodunun görebileceği bir yere kopyalamak. Sıralama dizeleri, nesneler, diziler ve diğer türler zor şeylerdir.

Ancak P / Invoke birlikte çalışma katmanı, neredeyse tüm bunları sizin için halleder.


3
Marshalling gerçekten kopyalama işlemleri yapıyor mu? Gerçek zamanlı görüntü işleme operasyonlarına bakıyorum ve bellekteki her şeyin kopyasını almak zorunda kalmamayı tercih ederim.
ıas

7

Vinko'nun yorumlarda dediği gibi, ilkel tiplere herhangi bir özel sıralama yapmadan geçebilirsiniz. Bunlar "blittable" türler olarak adlandırılır ve bayt, kısa, int, uzun vb. Türleri ve bunların işaretsiz karşılıklarını içerir.

Bu sayfa, yazılabilir ve bölünemez türlerin listesini içerir .


7

Sıralama daha iyi bir kelime veya ağ geçidi istemek, yönetilmeyen dünyanın veri türleri ile pinvoke kullanarak iletişim kurmak için bir "ortam" dır ve verilerin güvenli bir şekilde geri döndürülmesini sağlar.


2

Marshalling, bir fonksiyonun imzasını farklı bir makinede bulunan farklı bir işleme geçirmektir ve genellikle yapılandırılmış verilerin, diğer işlemci sistemlerine aktarılabilen (serileştirme / serileştirme) özel bir formata dönüştürülmesiyle gerçekleştirilir.

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.