2013-08-07 112 views
6

我想寫一個C function的包裝,期望一個函數指針和任意用戶數據(void*)。函數指針我已經想出瞭如何處理使用委託,但我不知道如何將object轉換爲void*將對象轉換爲void *並返回?

我可以把它ref object而是因爲其行爲類似指針據我所知,但是當我嘗試,我得到像

在轉換過程中檢測到無效VARIANT從非託管VARIANT到異常管理對象。將無效的VARIANT傳遞給CLR可能會導致意外的異常,損壞或數據丟失。

This "solution"可能適用於我,但我想必須有一種方法可以將任意數據傳遞給C DLL,以便稍後傳回?

+1

IntPtr呢? –

+0

個人而言,我認爲你最好通過'fixed'塊來使用指向'struct'的指針...... –

+0

@NoIdeaForName:C DLL將接受一個'IntPtr'沒問題,但是我怎麼把它打開當它返回時返回一個'object'(以及如何將一個對象轉換爲一個IntPtr)? – mpen

回答

2

個人而言,我建議在這裏使用struct,它更適用於您正在嘗試做的事情(如果需要,還可以調整內部佈局)。例如,具有struct Foo,並在參考型foo一個字段:

unsafe void Bar() 
{ 
    fixed (Foo* ptr = &foo) // here foo is a field on a reference-type 
    { 
     void* v = ptr; // if you want void* 
     IntPtr i = new IntPtr(ptr); // if you want IntPtr 
     // use v or i here... 
    } 
} 

注意:如果foo局部變量,那麼它是在堆棧上和甚至不需要對是fixed

unsafe void Bar() 
{ 
    Foo foo = new Foo(); 
    Foo* ptr = &foo; // here foo is a local variable 

    void* v = ptr; // if you want void* 
    IntPtr i = new IntPtr(ptr); // if you want IntPtr 
    // use v or i here... 
} 
+0

關於第二位的問題 - 如果'foo'在堆棧上,它不會在堆棧結束時彈出堆棧該函數,從而留下一個懸掛指針的C DLL? – mpen

2

如果沒弄錯,我認爲你需要Pointer.BoxPointer.UnBox方法。 這些方法有助於對非託管指針進行裝箱和取消裝箱。 在msdn檢出Pointer.BoxPointer.UnBox

+0

如果我正在閱讀此權利,這聽起來倒退。 'Box'需要一個「提供的非託管內存指針」。 C DLL有* not *提供給我一個'void *',我需要生成一個傳遞給它。我相當肯定'Unbox'將會失敗,除非'對象'首先被裝箱。 – mpen

+0

+1哇!我不知道'Pointer.Box'! – xanatos

+0

你想傳遞的'userdata'的實際類型是什麼? –

相關問題