我可以将来自 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;
}
我有一个 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;
}