簡體   English   中英

從C#調用C ++代碼時出現System.EntryPointNotFoundException

[英]System.EntryPointNotFoundException when calling C++ code from C#

// ------------------------------------- C#Code --------- ---------------------------

[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 ++代碼的代碼:

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

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

這幾乎可以肯定是因為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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM