2017-06-21 17 views
-1

メモリ不足の例外をスローする問題に取り組んでいます。あるSystem.Runtime.InteropServices.Marshal.SizeOf()によって計算された最大バイト

$exception 
{"Type 'System.String' cannot be marshaled as an unmanaged structure; no meaningful size or offset can be computed."} 
System.ArgumentException 

コードを::

var size = System.Runtime.InteropServices.Marshal.SizeOf(xmlDataSet.GetXml()); 

任意のアイデアみんな私が犯人のデータ型のサイズを知るためにSystem.Runtime.InteropServices.Marshal.SizeOf()を使用しようとしましたが、それは言ってexceptioくれましたか?

+2

元の問題を解決するためにこの質問に対する回答はありますか? – CodeCaster

+0

'Marshal.SizeOf'は、実際にデータを管理されていないメモリにマーシャリングしようとしている場合にのみ関連します。そうでなければ、それは無関係です。 –

+1

代わりに何らかの種類のメモリプロファイラを使うことを考えましたか?私は、たとえば、個人的にも職場でも、dotMemoryを使っているので、本当にそれをお勧めします。 – bassfader

答えて

0

damien_the_unbelieverはマーシャルの仕事をmanaged and unmanaged世界の間の橋渡しとして指摘していました。文字列は、管理対象外の世界に存在していないとあなたが本当にwhant私は、次の

class Program 
{ 
    static void Main(string[] args) 
    { 
     Test xmlStruct; 
     xmlStruct.xmlFile = "bla blaaaaaaaaaaaaaaaaaaaaaaaaaah"; 
     xmlStruct.number = 0; 

     var size = System.Runtime.InteropServices.Marshal.SizeOf(xmlStruct); 
     Console.WriteLine(size); 

    } 

} 
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
struct Test 
{ 

    [MarshalAs(UnmanagedType.BStr)] 
    public String xmlFile; 

    [MarshalAs(UnmanagedType.I4)] 
    public int number; 
} 

**Note** 

それを試してみることをお勧めサイズをチェックする場合には、folowing非管理対象システムの種類

UnmanagedType.BStr 
UnmanagedType.LPStr 
UnmanagedType.LPTStr 
UnmanagedType.LPWStr 

の一つとしてマーシャリングする必要がありますこれはあなたに2つのポインタの値である8バイトのポインタのサイズを与えます。 サイズを計算したい場合は、これに従ってくださいlink

関連する問題