2013-08-20 144 views
1

// ------------------------------------ - C#代碼------------------------------------從C#調用C++代碼時System.EntryPointNotFoundException

[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。有人會知道我做錯了什麼嗎?這是編組字符串的正確方法嗎?

回答

1

這幾乎肯定是因爲C#不能將您的Test方法名稱映射到本機代碼中的Test方法。嘗試指定入口點=「測試」屬性的方法如下:

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

也許你需要添加代碼的C++代碼在頭文件:

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

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