【发布时间】:2017-08-22 07:46:29
【问题描述】:
向有处理过 C++ 和 C# 经验的人寻求帮助
我现在正在写一个C#项目,需要调用内部库中已有的C++函数,遇到了一些困难。
C++ 代码函数头(无法更改)
typedef int (*PTR_func)
(const char* param1, // input
const char* param2, // input
VirtualInternalString& po_output); // Third param is actually the output
内部字符串对象的 C++ 代码类(无法更改)
namespace InternalLib
{
class VirtualInternalString
{
public :
virtual ~VirtualInternalString(){};
virtual void _cdecl SetString(const char *) =0;
virtual const char * _cdecl c_str() const =0;
};
class SafeInternalString :public VirtualInternalString
{
public :
SafeInternalString():TheString(""){};
virtual ~SafeInternalString(){};
virtual void _cdecl SetString(const char * chararray) { TheString = chararray;};
virtual const char * _cdecl c_str() const { return TheString.c_str() ;} ; // This is the std::string
protected:
std::string TheString;
};
class SafePtrString :public VirtualInternalString
{
public :
SafePtrString():PtrString(0){};
SafePtrString(std::string &str):PtrString(&str){};
virtual ~SafePtrString(){};
virtual void _cdecl SetString(const char * chararray) { (* PtrString) = chararray;};
virtual const char * _cdecl c_str() const { return PtrString->c_str() ;} ;
protected :
std::string * PtrString;
};
}
现在我必须在我的 C# 代码中使用这个“函数”。我可以正确调用和使用 C++ 函数,但是在输出返回(第三个参数)期间出现问题。应该是问题相关的返回类型。
C#(可更改)
[DllImport("xxxxlib", CallingConvention = CallingConvention.Cdecl)]
private extern static int func(string param1,
string param2,
[MarshalAs(UnmanagedType.LPStr)] StringBuilder res); // problem here
我知道我必须创建一个适当的包装器来将 c++ 对象分解为 C# 字符串,但我之前没有这方面的经验。我尝试了几种来自互联网的解决方案,但都不起作用。
有人知道我可以如何实现吗?你介意给我看一些简单的 C# 框架代码吗?
【问题讨论】:
-
几分钟前我没有看到这个确切的问题吗?是你发了然后删了吗?如果是这样,请不要那样做。相反,您应该编辑已有的问题。
-
抱歉...您对这篇文章有任何想法吗?目标是获取返回的 c++ 对象中的字符串。这应该不难,但我真的尝试了不同的方法并且很挣扎。还是不行
-
P/Invoke 仅适用于与 Win32 API 使用的 API 类似的 API。它只能翻译符合它知道如何翻译的 C 风格的函数和结构。对于像这样复杂的任何事情,您都需要。 C++/CLI 桥。或者您可以公开符合 P/Invoke 支持的函数。
-
@vasek 建议的副本不包括这种情况,因为帖子中的对象不能在 C++ 和 C# 之间编组。需要更多信息来解释为什么这是不可能的以及如何弥合差距。