我是否可以封送来自C/C++;将结构转换为具有属性的C#结构?

我是否可以封送来自C/C++;将结构转换为具有属性的C#结构?,c#,struct,interop,pinvoke,marshalling,C#,Struct,Interop,Pinvoke,Marshalling,我有一个C#结构,用于与一些本机代码进行接口。假设它看起来像这样,并且dll中有一个入口点可用于检索此结构的值: 公共结构MyNativeStruct { 公共双示例字段; } [DllImport(“SomeDll”)] 公共静态外部MyNativeStruct GetMyNativeStruct(); 该结构用于从本机dll中获取结构化值,即它镜像dll中的结构。这是所有正确的编组,因此我可以在.NET应用程序中很好地使用这些值 后来,我遇到了一种情况,我真的需要一个具有属性而不是字段的结

我有一个C#结构,用于与一些本机代码进行接口。假设它看起来像这样,并且dll中有一个入口点可用于检索此结构的值:

公共结构MyNativeStruct
{
公共双示例字段;
}
[DllImport(“SomeDll”)]
公共静态外部MyNativeStruct GetMyNativeStruct();
该结构用于从本机dll中获取结构化值,即它镜像dll中的结构。这是所有正确的编组,因此我可以在.NET应用程序中很好地使用这些值

后来,我遇到了一种情况,我真的需要一个具有属性而不是字段的结构(或对象),所以我真正想要的是看起来更像这样的东西:

struct MyNativeStruct
{
公共双示例字段{get;set;}
}
现在,我当然可以包装
extern
方法,该方法从dll获取结构,然后将其转换为具有如下属性的对象:

公共密封类MyNativeClass
{
公共双示例字段{get;set;}
}
//从MyNativeStruct获取值的一些快速而肮脏的函数。
公共静态MyNativeClass GetMyNativeClass()
{
var nativeStruct=GetMyNativeStruct();
返回新的MyNativeClass{ExampleField=nativeStruct.ExampleField};
}
但是这意味着我必须为我想要从dll中检索的每个本机结构创建2种类型,所以我希望有一种很好的方法将本机结构封送到带有属性而不是字段的.NET结构中

我想也可以先用公共字段创建结构,这些字段也由结构中的属性支持


无论如何,我想知道是否有一些标准的、惯用的或内置的方法可以将本机结构类型封送到具有属性而不是公共字段的C#结构类型中。

对于将来来到这里的任何人,我的解决方案是在结构字段之后添加属性(正如格斯伯格、大卫·赫弗南(David Heffernan)和西蒙·穆里尔(Simon Mourier)在评论中所建议的那样)

所以我的结构现在看起来有点像这样:

struct MyNativeStruct
{
私有双示例字段;
公共双示例属性=>ExampleField;
}

对于将来来到这里的任何人,我的解决方案是在struct字段后添加属性(正如GSerg、David Heffernan和Simon Mourier在评论中所建议的那样)

所以我的结构现在看起来有点像这样:

struct MyNativeStruct
{
私有双示例字段;
公共双示例属性=>ExampleField;
}

自动实现的属性由自动创建的字段进行备份。这些属性将被封送。请参阅。@MattB链接告诉您显式声明支持字段,所以只需这样做。只需显式声明支持字段。@Simon我有理由相信这是不正确的。请提供源代码。@canton7我猜是自动实现的属性。@Auto implemented properties是用自动创建的字段备份的。这些字段将被封送。请参阅。@MattB链接告诉您显式声明支持字段,所以请这样做。只需显式声明支持字段。@Simon我有理由相信这是错误的。请提供一个源。@canton7我猜。为什么?像往常一样将字段设为私有,并具有正常的属性。当前您有一个可读的可写字段和一个只返回其内容的函数。这非常令人困惑。我的坏消息是我使用auto-pilot,但我只需要getter。为什么?像往常一样将字段设置为私有,并使用get和set设置一个普通属性。当前您有一个可读的可写字段和一个只返回其内容的函数。这很混乱。我的坏消息是我使用了auto-pilot,但我只需要getter就可以了。