C# 使用C将非托管结构封送到托管代码#

C# 使用C将非托管结构封送到托管代码#,c#,.net,struct,unmanaged,marshalling,C#,.net,Struct,Unmanaged,Marshalling,我需要处理从外部应用程序获取的字节[]。外部应用程序也是用C#完成的,它们通过UDP发送字节。他们正在发送从struct转换的字节,如下所述: public struct DISPATCH_MESSAGE { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public char[] federation_name; // Units: nil Range: nil } 所以,当我得到字节时,我需要取出其中的c

我需要处理从外部应用程序获取的字节[]。外部应用程序也是用C#完成的,它们通过UDP发送字节。他们正在发送从struct转换的字节,如下所述:

public struct DISPATCH_MESSAGE
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
    public char[] federation_name; // Units: nil     Range: nil
}
所以,当我得到字节时,我需要取出其中的char[], 并从该字符[]中获取字符串


我不熟悉这种非托管编码。

您可能应该将其声明为
ByValTStr
(根据字符串的性质,可能会有所不同):

更新:如果它已经发出了一个
char[]
,那么它可能正在正确地进行必要的转换(包括处理编码),因此我认为您只需要:

string str = new string(instance.federation_name);

您正在从UDP连接读取原始字节吗?我没有访问外部应用程序的权限。我要做的任何事都应该在我的申请表上。谢谢。您好,如何在string str=new string(instance.federation_name);?中获取实例???谢谢我是这方面的新手。可能有一个函数返回(或接受)这样的实例。。。不是吗?如果没有,使用这个结构有什么意义?是的,那很好。。。那么,你的意思是说,非托管字符[]对于从中获取字符串很重要吗?据我谷歌搜索,我知道我们必须用马歇尔来做这件事。如果我错了,请纠正我。谢谢。@karthik:你说过你不能改变代码中结构的定义,因为它在一个单独的库中。如果您没有在代码中声明DISPATCH_MESSAGE(托管消息),那么声明它的库可能有一些返回实例的方法。如果没有,那么您确实可以控制结构的托管定义,在这种情况下,您需要知道存储在非托管char[]中的字符串的格式(是否以null结尾,是否以unicode…)才能正确取出该字符串。
string str = new string(instance.federation_name);