向有 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# 代码中使用这个“func”。我可以正确调用和使用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# 框架代码吗?
最佳答案
瓦塞克的possible duplicate如果只更改 C# 方面,则无法工作。但您可以做的是在 C++ 中创建包装器,以创建带有关联的 length
参数的原始 char *
。
您创建一个附加的 C++ header 和源代码,其中包含:
int func
(const char* param1, // input
const char* param2, // input
char* po_output, // Third param is actually the output
int length); // Length of the buffer allocated by caller
然后您的 func
调用 PTR_func
。
关于c# - 如何将 C++ 对象传递给 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45811773/