c# - 结合 C 和 C#。结构的

标签 c# c casting wrapper

我需要帮助,我有一个 C 结构:

struct Connection 
{
    int From;
    int To;
    double Weight;
};

struct Node
{
    int ID;
    double Value;
};

struct ListElement
{
    ListElement *next;
    void *element;
};

struct NeuroNet
{
    ListElement *nodes;
    ListElement *connections;
    int inputs;
    int outputs;
};

具有一些功能性(例如通行证之类的东西)。 (那件事的全部目的是提高单线程性能)

我需要用 C# 代码使用这个神经网络功能,但问题来了:我将通过 C# 教这个神经网络(改变权重),我想直接改变字段的连接结构,并使用对于每一种段落,示例:

foreach(var c in WrapperClassName.GetConnections()) {
... 
    c.Weight = c.Weight + 0.3 / someCSvariable;
...}

WrapperClassName.ForEachConnection(x => { 
...
    x.Weight = x.Weight + 0.3 / someCSvariable;
... });

那么,我该怎么做呢?

有没有办法将结构上的 C 指针转换为 C# 类(因为它是 ref var)?

最佳答案

您似乎正试图将链表从 C# 传递到 C。这意味着您需要使用 Interop 服务。看一下 StructLayoutAttribute 类。您还需要使用 IntPtr 定义指针。

这是将它用于您的一个结构的示例:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct Connection 
{
   public Int32 From;
   public Int32 To;
   public Double Weight;
};

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
private struct ListElement{ 
  public IntPtr next;
  public IntPtr element; 
};

我喜欢查找互操作性问题答案的方法是查找已定义的类似结构。我通常使用 pinvoke.net 来查找它们。这是 IP_ADDR_STRING 的示例这是一个 IP 地址的链表。

关于c# - 结合 C 和 C#。结构的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42514080/

相关文章:

c - 这有什么问题?

c - 如何将 64 位整数转换为 char 数组并返回?

c# - 在事件分派(dispatch)之前检查 null ...线程安全吗?

c# - 表达式表示 `type' ,其中应为 `variable' 、 `value' 或 `method group' (CS0119) (MyFirstGame)

将值分配给结构中的地址时出现 C 段错误

java - 关于字节添加和赋值的有趣观察

c++ - 将 int16_t 内存转换为 float

java - 教科书中的类型转换问题——它是 0.05 还是 0.5?

c# - 在 Visual Studio 调试器中以自定义顺序显示属性

c# - Refit ApiException 的最佳重试策略?