2012-02-21 17 views
0

私はインターフェースIProxyと実装プロキシを持っています。プロキシの目的は、Cライブラリに呼び出すいくつかのextern関数をラップすることです。 extern宣言では、これは構造体がrefキーワードを使用して渡されることを必要とします。refキーワードとラッパーメソッド

namespace CFuncs { 
    [DllImport("cLibrary.dll", CallingConvention = CallingConvention.Cdecl)] 
    public static extern int MyCFunc(ref MyStruct result); 
} 

public interface IProxy { public int MyFunc(MyStruct result); } 

public class Proxy : IProxy { 
    public int MyFunc(MyStruct result) { 
    return CFuncs.MyCFunc(ref result); 
    } 
} 

Cヘッダファイルから関数declartion:

int MyCFunc (MY_STRUCT* result); 

typedef struct { 
    // some fields 
} MY_STRUCT; 

そして、呼び出し元のコード:

var proxy = new Proxy(); 
var result = new MyStruct(); 
proxy.MyFunc(result); 

私の質問は、私はラッパーでREFを使用する必要があります。ここでのサンプルですインターフェイスと実装も、または構造体がC関数によってデータで適切に埋められますか?

EDIT:サンプルとして提示されたコードは機能しているようです。 Cライブラリがポインタを必要としているにもかかわらず、実際にそれを変更することはありませんか?ポインタはポインタを取る関数との相互作用のためのrefですか?ライブラリに付属しているサンプルのCコードには、呼び出し側が、何かを意味する場合には、それが取る構造体のためにメモリを割り当てることが常にあります。

答えて

1

.NETはコールバイ値を使用し、さらにstructは値型です。したがって、外部関数によって変更したい場合は、refパラメータにする必要があります。

関連する問題