7

ANSI C ライブラリの .NET ラッパーに取り組んでいます。C .h は次のようになります。

EXTERNC void foo_init(void);

EXTERNC char* foo_string_magic(const char *str);

EXTERNC void foo_cleanup(void);

私の C++/CLI ラッパーは次のようになります。

public ref class FooWrapper abstract sealed
{
    private:    

        /// <summary>
        /// Provides an RAII context for native types lacking a destructor.
        /// </summary>
        static marshal_context ^_Context;    

        /// <summary>
        /// Marshals .NET String to native const char*. 
        /// </summary>
        static const char* _MarshalString(String ^str)
        {               
            return _Context->marshal_as<const char*>(str);
        }    

    public:    

        /// <summary>
        /// Initializes foo.
        /// </summary>
        static void Initialize()
        {
            _Context = gcnew marshal_context();             

            foo_init();
        }    

        /// <summary>
        /// This function should be called once you're done with using foo.
        /// </summary>
        static void Cleanup()
        {
            foo_cleanup();

            // uncommenting this line throws heap corruption error
            // delete _Context;
        }    

        /// <summary>
        /// Foo's magic!
        /// </summary>
        static String^ StringMagic(String ^str)
        {
            char *fooString = _MarshalString(str);

            return gcnew String(foo_string_magic(fooString));
        }
}

marshal_context での gcnew の適切な使用について混乱しています。 MSDNは gcnew を使用して marshal_context をインスタンス化しますが、オンラインの例の多くは marshal_context をまったくインスタンス化しません。

私の質問は次のとおりです。

  1. marshal_context での gcnew の使用はオプションですか? もしそうなら、なぜですか?
  2. 私のラッパーは、Cleanup() の呼び出し時にヒープ破損エラーをスローする C# アプリケーションによって消費されます。なんで?
4

0 に答える 0