2011-12-30 7 views
1

オブジェクトの型として格納されている任意の型の配列の最初の要素のメモリアドレスを取得する必要があります。たとえば、配列はdouble []またはint []でもかまいませんが、コードではObjectとして型指定されます。オブジェクトとして格納されている配列の最初の要素のアドレスを取得する

既知の型の配列のアドレスを取得するのは簡単ですが、C#ではオブジェクトのアドレスを取得することはできません。このような配列を格納するために使用できる型(Object以外)があり、メモリアドレスがより簡単に取得できるかどうかまたは、Interop/Reflectionを使用して中間データコピーを必要とせずに直接アドレスにアクセスする方法はありますか?

下の2行目にはdouble []がオブジェクトとして格納されています。そしてfixed()行に、oのアドレスを取得しようとしていることに気付きました。これはC#で許可されていません。

ありがとうございます!

int len=100; 
object o = new double [len]; 

    unsafe 
    { 
       fixed(int*ptr=&o) 
       for (int index = 0; index < len; index++) 
       { 
        // access data directly to copy it, etc... 
       } 

    } 
+1

なぜこれをやろうとしていますか? –

+0

これは質問に正確には答えていません(したがって、コメントです)が、 'Array'型の参照を宣言し、' Array'クラスを使用することで、おそらくほとんどのことを行うことができます(例えば 'Array.Copy () '。 – phoog

+1

@Robert:DirectComputeでの作業に関するいくつかの作業を自動化したいのですが、CPUの構造体配列をGPUバッファにバインドするには、データのコピーを自動化し、 –

答えて

4

あなたはGCHandleを使ってこれを実現することができます

int len=100; 
object x = new long[len]; 
unsafe 
{ 
    var gch = GCHandle.Alloc(x, GCHandleType.Pinned); 
    try 
    { 
     void* addr = (void*)gch.AddrOfPinnedObject(); 
     // do whatever you want with addr 
    } 
    finally 
    { 
     gch.Free(); 
    } 
} 

ちょうどあなたが本当にこれを必要とすることを確認してください。

+0

ありがとう!これは機能します。私は、GCのオブジェクトをピンすることが嫌いが、これは私の問題を解決します。 @Robertに対する私の応答では、私が何をしようとしているのかを説明します。 –

関連する問題