开发者

C# interop question

I have a struct like this:

[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;
}

How can I copy a C# string, str to struct memory location pointed by LogFileName ?


You just assign to the field:

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


I used the following to assign and retrieve the value:

[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;
    }

}

See MSDN: MarshalAsAttribute

Note: I used a SizeConst of 16 as an arbitrary value.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜