1

//------------------------------------- C# コード ---------- ---------------------------

[DllImport("MarshallStringsWin32.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
extern static void Test([MarshalAs(UnmanagedType.AnsiBStr)] out String str);

[DllImport("MarshallStringsWin32.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
extern static void FreeString([MarshalAs(UnmanagedType.AnsiBStr)] String str);

static void Main(string[] args)
{
    String str;
    Test(out str);
    FreeString(str);
}

//---------------------------------------------------- C++ コード ---------- ---------------------------

void Test(__out BSTR* str)
{
   const std::string stdStr = "The quick brown fox jumps over the lazy dog";
   _bstr_t bstrStr = stdStr.c_str();
   *str = bstrStr.copy();
}

void FreeString(BSTR str)
{
   SysFreeString(str);
}

Test() を呼び出すときに System.EntryPointNotFoundException が発生します。私が間違っていることを誰かが知っていますか?これは文字列をマーシャリングする正しい方法ですか?

4

2 に答える 2

1

これは、C# が Test メソッドの名前をネイティブ コードの Test メソッドにマップできないためです。次のように、メソッドに EntryPoint="Test" 属性を指定してみてください。

[DllImport("MarshallStringsWin32.dll", EntryPoint="Test", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
extern static void Test([MarshalAs(UnmanagedType.AnsiBStr)] out String str);
于 2013-08-20T15:13:17.390 に答える