6

関数ポインターと任意のユーザー データ ( ) を期待するC 関数のラッパーを作成しようとしていますvoid*objectデリゲートを使用して処理する方法はわかりましたが、 を に変換する方法がわかりませんvoid*

それはAFAIKのポインターのように動作するので、代わりにそれを作ることができますが、それref objectを試みると次のような例外が発生します

アンマネージ VARIANT からマネージ オブジェクトへの変換中に、無効な VARIANT が検出されました。無効な VARIANT を CLR に渡すと、予期しない例外、破損、またはデータの損失が発生する可能性があります。

この「解決策」は私にとってはうまくいくかもしれませんが、任意のデータをC DLLに渡して後で戻すことができるようにする方法が必要だと思いましたか?

4

2 に答える 2

2

個人的には、structこちらを使用することをお勧めします。これは、あなたがやろうとしていることにより適しています (さらに、必要に応じて内部レイアウトを微調整することもできます)。たとえば、struct Foo、およびreference-type のフィールドを 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...
}
于 2013-08-07T06:57:51.490 に答える