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

3

可能需要在头文件中添加c++代码的代码:

 extern "C" void __declspec(dllexport) FreeString(BSTR str);

 extern "C" void __declspec(dllexport) Test(BSTR* str);
于 2013-08-20T15:19:03.660 回答
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 回答