结合 C 和 C#。结构的
Combining C and C#. Structure's
我需要帮助,我有一个 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;
};
具有一些功能(例如通行证之类的东西)。
(那个东西整个ide就是提高单线程性能)
我需要用 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# class(因为它是 ref var)?
您似乎正试图将链表从 C# 传递到 C。这意味着您需要使用 Interop 服务。看看 StructLayoutAttribute class。您还需要使用 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 对象将位于非托管内存中,而 C# 对象将位于托管内存中。
我认为实现目标的最佳方法是使用 VC++,它具有在同一个程序集中混合非托管和托管代码的独特能力。因此,您可以将非托管 C 结构传递给托管 C++ 方法并使用类似 C# 的语法。托管 VC++ 方法可以调用 C# 或被 C# 调用,所以如果你真的想在 C# 中做事,这可能是一种方式。
当然还有其他方法可以连接 C 和 C#,例如您可以使用 DllImport 将 C# 连接到 C 函数。但是,当您调用该函数时,必须使用称为编组的工具将参数传输 to/from 非托管内存。对于 int、double 甚至 struct 等常见类型,编组很简单,但对于需要考虑对齐的结构,编组要复杂得多……完成这项工作所需的麻烦在我看来根本不值得查看。
所以我的建议是 VC++ 试一试。
我需要帮助,我有一个 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;
};
具有一些功能(例如通行证之类的东西)。 (那个东西整个ide就是提高单线程性能)
我需要用 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# class(因为它是 ref var)?
您似乎正试图将链表从 C# 传递到 C。这意味着您需要使用 Interop 服务。看看 StructLayoutAttribute class。您还需要使用 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 对象将位于非托管内存中,而 C# 对象将位于托管内存中。
我认为实现目标的最佳方法是使用 VC++,它具有在同一个程序集中混合非托管和托管代码的独特能力。因此,您可以将非托管 C 结构传递给托管 C++ 方法并使用类似 C# 的语法。托管 VC++ 方法可以调用 C# 或被 C# 调用,所以如果你真的想在 C# 中做事,这可能是一种方式。
当然还有其他方法可以连接 C 和 C#,例如您可以使用 DllImport 将 C# 连接到 C 函数。但是,当您调用该函数时,必须使用称为编组的工具将参数传输 to/from 非托管内存。对于 int、double 甚至 struct 等常见类型,编组很简单,但对于需要考虑对齐的结构,编组要复杂得多……完成这项工作所需的麻烦在我看来根本不值得查看。
所以我的建议是 VC++ 试一试。