【问题标题】:Combining C and C#. Structure's结合 C 和 C#。结构的
【发布时间】:2017-02-28 16:33:07
【问题描述】:

我需要帮助,我有一个 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 类型的段落,示例:

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 casting wrapper


    【解决方案1】:

    您似乎正在尝试将链接列表从 C# 传递到 C。这意味着您需要使用互操作服务。看一下 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 地址的链接列表。

    【讨论】:

      【解决方案2】:

      无法将 C 指针强制转换为 C# 引用,因为 C 对象将位于非托管内存中,而 C# 对象将位于托管内存中。

      我认为实现目标的最佳方法是使用 VC++,它具有在同一个程序集中混合非托管和托管代码的独特能力。因此,您可以将非托管 C 结构传递给托管 C++ 方法并使用类似 C# 的语法。托管的 VC++ 方法可以调用或由 C# 调用,所以如果你真的想用 C# 做事,这可能是一种方法。

      当然还有其他方法可以连接 C 和 C#,例如您可以使用 DllImport 将 C# 连接到 C 函数。但是,当您调用该函数时,必须使用称为编组的工具将参数传入/传出非托管内存。对于 int、double 甚至 struct 等常见类型,编组很简单,但对于需要考虑对齐的结构来说,编组要复杂得多……完成这项工作所需的麻烦在我看来根本不值得查看。

      所以我的建议是试一试VC++。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多