2011-08-07 124 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的結構內存位置LOGFILENAME指出?

+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作爲任意值。