【问题标题】:System.EntryPointNotFoundException when calling C++ code from C#从 C# 调用 C++ 代码时出现 System.EntryPointNotFoundException
【发布时间】:2013-08-20 14:58:25
【问题描述】:

//------------------------------------- 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。有人会知道我做错了什么吗?这是编组字符串的正确方法吗?

【问题讨论】:

    标签: c# c++ .net marshalling


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      这几乎可以肯定是因为 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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-22
        • 1970-01-01
        • 2010-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多