2017-04-06 3 views
-1

をマーシャリング、私はC#からCにデータを設定する必要があるたびに、私はを呼び出す必要があります10からCへデータを取得したい場合は、GetMyStructと呼ぶ必要があります。私はこれを毎秒50回行う必要があります。C#の私が働くこのCC#のコードをしたC構造体

いつもSetMyStructGetMyStructを呼ぶのを避ける方法はありますか? SetMyStructを一度使用してから、すべての変更を反映させたいと思います。これが可能かどうかはわかりません。

+0

を変更してみてください'struct'から' class'に変更して、 'ref'キーワード – xanatos

+4

このような非常に単純な構造体は技術的に可能です。 MyStruct *を返す関数を公開して、cへのポインタを返すことができます。 C#プログラムで 'unsafe'コードを使用して、aおよびbメンバーに直接アクセスします。しかし、このコードを最適化する必要があるかどうかはチェックしていませんでした。 1秒間に60回だけ呼び出すと、間違いなくあなたはそうするでしょう。これは非常に高速なコードで、毎秒何億回も呼び出すことができます。 –

+0

ようこそスタックオーバーフロー!あなたがまだ持っていないなら、[ツアー]を取って、[尋ね]を見て、あなたが "コードを投稿する前に問題を紹介"しなければならないと言います。 – PJvG

答えて

-1

unsafeとポインタでこれを行うことができます。

"安全でない"を有効にしてC#プログラムをコンパイルする必要があります。

EDIT:より良い方法:

がライブラリに次の関数を追加します:C#ので

__declspec(dllexport) void GetMyStructRef (MyStruct** s); 
void GetMyStructRef(MyStruct** s) 
{ 
    *s = &mystruct; 
} 

[DllImport(DLL_NAME, EntryPoint = "GetMyStructRef")] 
protected static extern void GetMyStructRef(ref MyStruct* s); 

MyStruct* data; 
GetMyStructRef(ref data); 
Console.WriteLine($"{data->a} {data->b}"); 

旧答え:

unsafe class MyClass : IDisposable 
{ 
    [DllImport(DLL_NAME, EntryPoint = "GetMyStruct")] 
    protected static extern void GetMyStruct(MyStruct* s); 

    [DllImport(DLL_NAME, EntryPoint = "SetMyStruct")] 
    protected static extern void SetMyStruct(MyStruct* s); 

    GCHandle handle; 
    MyStruct* structRef; 

    public void MyClass() 
    { 
     //we need to get a pinned reference to your struct 
     handle = GCHandle.Alloc(new MyStruct(), GCHandleType.Pinned); 
     structRef = (MyStruct*)handle.AddrOfPinnedObject().ToPointer(); 

     SetMyStruct(structRef); 
    } 

    public void Dispose() 
    { 
     //We need to free the handle to release memory 
     //GC will not collect it without this 
     handle.Free(); 
    } 
} 
+0

管理されていないリソースを持つクラスを作成する場合は、それより少し洗練されたものにする必要があります。 [Lostechies:IDisposable、Done Right](https://lostechies.com/chrispatterson/2012/11/29/idisposable-done-right/) –