Soketten göndermek için bir yapı tanımladım. Bunun büyüklüğünü almak istiyorum ama sizeof
güvensiz ve "System.Runtime.InteropServices.MarshalSizeOf
" için aynı. Boyutu güvenli bir şekilde almanın bir yolu var mı?C# sizeof neden güvensiz ve güvenli bir şekilde bir yapının boyutunu nasıl alabilirim?
cevap
Yönetilen yapılar için bunu yapmanın bir yolu yoktur. Marshal.SizeOf
, yalnızca veriyi, bazı platformlardaki yönetilen türler için doğru olan, ancak diğerlerinde değil, yapıyı oluşturan gruplanmış türlerde döndürür ... MIGHT.
Bu, JIT, çalıştığı platforma bağlı olarak yapıları farklı şekilde yerleştirebilmesi için tasarım gereğidir. Burada
diğer bilgiler: Chris Brumme's blog
Önemli soru, yapının boyutunu neden bilmeniz gerekiyor? Oranlar güvensiz bir nedenden ötürüdür (bu durumda 'sizeof' kullanabilirsiniz) ya da bir P/Invoke içindir (bu durumda' Marshal.SizeOf' doğru cevaptır). – Gabe
Anlaşmalı. Sadece asıl soruya cevap vermeye çalışıyordu: "neden buyeof güvensiz ve bir yapının büyüklüğünü güvenli bir şekilde nasıl alacak?" :-) – Jcl
Bunun bir nedeni: bir çok yapı dizisi oluşturmak ve 2 GB'a kaç tane sığabileceğini bilmeniz gerekiyor. Çalışma zamanının yapı için ne kadar bellek ayırdığını bilmeniz gerekir. –
JIT (zamanında) yönetilen türünün büyüklüğünde olacak tanımlamak ne olacağını belirlemek sağlayan bir sarıcı kütüphanesi için my blog post bakınız. C# 'de hiç görünmeyen sizeof
IL komutunu kullanarak çalışır. Hiçbir özel izin olmadan çalıştırılabilir ve doğrulanabilir.
Not: Bu, gerçekten istediğiniz gibi olabilir veya olmayabilir. Bu, aslında yalnızca tek bir bayt içeren bir yapı için 8
döndürülebilir. Sorunuzu tam olarak anlamadım, bu yüzden gerçekten istediğin ya da istemediğinden emin değilim.
- 1. Nasıl güvenli bir şekilde C++
- 2. sizeof boş yapısı C cinsinden 0 ve C++ da neden?
- 3. sizeof operatörü bir yapı içinde ekstra boyut verir C#
- 4. Bir yapı kendi boyutunu neden saklayabilir?
- 5. Bir dosyayı nasıl güvenli bir şekilde silebilirim?
- 6. Neden C dosyalarında sizeof (double) kullanmamalıyım
- 7. c dili sizeof deyimi
- 8. sizeof üye hesaplama hatası
- 9. Bir görünümün kenar boşluğunun boyutunu nasıl alabilirim?
- 10. Bir dizinin boyutunu Perforce'den nasıl alabilirim?
- 11. C++ sizeof ile bool
- 12. Yapı boyutunu ve içeriğini golang olarak bayt cinsinden nasıl alabilirim?
- 13. HowChar güvenli bir şekilde nasıl iptal edilir?
- 14. Güvenli bir şekilde C# WPF kontrolüne nasıl erişilir?
- 15. Golang'daki bir yapının json alan isimlerini nasıl alabilirim?
- 16. neden sizeof ("- 2147483648") - 1
- 17. Tamsayılar nasıl güvenli bir şekilde verilir?
- 18. Dize boyutunu bayt cinsinden nasıl alabilirim?
- 19. sizeof() std :: vektör (C++)
- 20. Sabit ve Güvensiz
- 21. Bir yapının sınıftaki çocuklarına nasıl döngü yapılır?
- 22. Android'de işitme güvenli bir şekilde nasıl durdurulur?
- 23. Neden üyeleri bir yapının içinde başlatamıyoruz?
- 24. Neden bir yapının yapıcısında özellik ayarı çalışmıyor?
- 25. Array ve sizeof hataları derleme sıkıntıları C++
- 26. printf bir yapının adresini görmek nasıl
- 27. Deployd: dpd-pasaport nasıl uygulanır ve güvenli bir şekilde doğrulanır
- 28. Sertifikanın anahtar boyutunu nasıl alabilirim
- 29. Güvensiz bölümlerde neden bekleme yasaktır?
- 30. Güvensiz jenerik dökme
Güvenli bir şekilde tanımlayın. “Marshal.SizeOf”, CLR ile ilgili olduğu sürece tamamen güvenlidir. – Noldorin
Noldorin - Marshal.SizeOf, çalıştırmak için UnSafe Code izninin ayarlanmasını gerektirir. Bu OP'nin sorunu olan –
System.Runtime.InteropServices.MarshalSizeOf (typeof (MyStruct)) denedim ve hiçbir yerde "güvensiz" denedim ve Güvenli olmayan kodlara izin ver onay kutusunun işaretini kaldırdım. Şimdi bana iyi çalışıyor. ?????? – 5YrsLaterDBA