我可以将来自 C/C++ 结构的数据编组到具有属性的 C# 结构中吗?

Can I marshal data from a C/C++ struct into a C# struct with properties?

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

public struct MyNativeStruct 
{
    public double ExampleField;
}

[DllImport("SomeDll")]
public static extern MyNativeStruct GetMyNativeStruct();

该结构用于从本机 dll 中获取结构化值,即它反映了 dll 中的结构。这一切都是正确编组的,所以我可以在我的 .NET 应用程序中使用这些值。

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

struct MyNativeStruct 
{
    public double ExampleField { get; set; }
}

现在我当然可以包装 extern 方法,它从 dll 中获取结构,然后将其转换为具有如下属性的对象:

public sealed class MyNativeClass 
{
    public double ExampleField { get; set; }
}

// Some quick and dirty function to get values from MyNativeStruct.
public static MyNativeClass GetMyNativeClass() 
{
    var nativeStruct = GetMyNativeStruct();
    return new MyNativeClass { ExampleField = nativeStruct.ExampleField };
}

但这意味着我必须为我想从 dll 中检索的每个本机结构创建 2 种类型,所以我希望可能有一些不错的方法可以将本机结构编组为 .NET 结构属性而不是字段。

我想也可以首先使用 public 字段创建结构,这些字段也由结构中的属性支持。

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

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

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

struct MyNativeStruct 
{
    private double ExampleField;
    public double ExampleProperty => ExampleField;
}