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 をまったくインスタンス化しません。
私の質問は次のとおりです。
- marshal_context での gcnew の使用はオプションですか? もしそうなら、なぜですか?
- 私のラッパーは、Cleanup() の呼び出し時にヒープ破損エラーをスローする C# アプリケーションによって消費されます。なんで?