2017-02-28 4 views
1

私は助けを必要とし、私はCの構造を有する:(パスや物事のようなもののような)いくつかの機能を持つCと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(var c in WrapperClassName.GetConnections()) { 
... 
    c.Weight = c.Weight + 0.3/someCSvariable; 
...} 

かそこら

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

、私はそれをどのように行うか:、iは、直接通路のforeachの種類を変更するには、フィールドの接続構造の、および使用するサンプルをご希望ですか?

そして、C#クラスを構造体にキャストする方法はありますか(ref varなので)?

答えて

1

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アドレスのリンクリストであるIP_ADDR_STRINGの例を示します。

1

Cオブジェクトが非管理メモリにあり、C#オブジェクトが管理対象メモリにあるため、CポインタをC#参照にキャストすることはできません。

あなたの目標を達成する最良の方法は、同じアセンブリ内で管理されていないコードと管理されたコードを混在させる独自の能力を持つVC++を使用することだと思います。したがって、管理されていないCの構造体をマネージC++のメソッドに渡して、C#のような構文を使用することができます。マネージドVC++メソッドはC#で呼び出すか呼び出すことができます。もしC#で実際にやりたければ、これは方法かもしれません。

もちろんCとC#を接続する他の方法があります。たとえば、DllImportを使用してC#をC関数に接続することができます。ただし、関数を呼び出すときは、マーシャリングと呼ばれる機能を使用して、引数をアンマネージメモリとの間で転送する必要があります。マーシャリングは、int型、double型、struct型などの一般的な型の場合は単純ですが、整列を考慮する必要がある構造体の方がはるかに複雑です...この作業を行うために必要なトラブルは、ビュー。

私の提案はVC++にショットを与えることです。