2010-03-10 17 views
5

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?

+0

Güvenli bir şekilde tanımlayın. “Marshal.SizeOf”, CLR ile ilgili olduğu sürece tamamen güvenlidir. – Noldorin

+1

Noldorin - Marshal.SizeOf, çalıştırmak için UnSafe Code izninin ayarlanmasını gerektirir. Bu OP'nin sorunu olan –

+0

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

cevap

3

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

+3

Ö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

+1

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

+1

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. –

0

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.

İlgili konular