我可以将数据从C / C ++结构打包为具有属性的C#结构吗?

问题描述 投票:0回答:1

我有一个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结构。字段。

我想也有可能先创建具有公共字段的结构,该结构也由结构中的属性作为后盾。

无论如何,我想知道是否存在某种标准的,惯用的或内置的方法来将本机结构类型编组为具有属性而不是公共字段的C#结构类型。

c# struct interop pinvoke marshalling
1个回答
0
投票

对于将来来这里的人,我的解决方案是在struct字段之后添加属性(如GSerg,David Heffernan和Simon Mourier在评论中所建议的。

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

struct MyNativeStruct 
{
    public double ExampleField;
    public double ExampleProperty => ExampleField;
}
© www.soinside.com 2019 - 2024. All rights reserved.