2011-08-07 12 views
0

私はこのような構造体を持っている:C#の相互運用質問

[StructLayout(LayoutKind.Sequential)] 
internal struct EVENT_TRACE_PROPERTIES 
{ 
    internal WNODE_HEADER WNode; 

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = (int)EventTracePropertiesStringSize)] 
    internal string LoggerName; 

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = (int)EventTracePropertiesStringSize)] 
    internal string LogFileName; 
} 

はどのようにしてログファイル名が指すメモリ位置を構造体へのC#の文字列、列strをコピーすることができますか?

+2

解決策があまりにも明白ですが、ここで本当の問題は何ですか? –

答えて

2

あなただけのフィールドに割り当てる:

EVENT_TRACE_PROPERTIES item; 
item.LogFileName = "My String"; 
0

私は値を代入して取得するには、次を使用:

[TestFixture] 
public class MarshalAsTest 
{ 
    [Test] 
    public void TestMarshalAs_SetLogFileName() 
    { 
     SomeClass someClass = new SomeClass(); 
     string logFile = "LogFileName.log"; 

     someClass.SetLogFile(logFile); 

     Assert.AreEqual(logFile, someClass.GetLogFile());    
    } 
} 

public class SomeClass 
{ 
    EVENT_TRACE_PROPERTIES props; 

    public void SetLogFile([MarshalAs(UnmanagedType.LPWStr)]String msg) 
    { 
     props.LogFileName = msg; 
    } 

    [return: MarshalAs(UnmanagedType.LPWStr)] 
    public string GetLogFile() 
    { 
     return props.LogFileName; 
    } 


    [StructLayout(LayoutKind.Sequential)] 
    internal struct EVENT_TRACE_PROPERTIES 
    { 
     internal WNODE_HEADER WNode; 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] 
     internal string LoggerName; 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] 
     internal string LogFileName; 
    } 

} 

MSDN: MarshalAsAttribute

を参照してください。注:私はのSizeConstを使用しました16を任意の値とする。