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.
精彩评论