c# - 如何将 C++ 对象传递给 C#

标签 c# c++

向有 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/

相关文章:

c# - .Net Socket 不响应远程断开连接?

c++ - 模板类和插入提取重载

c++检查基引用的大多数派生类是否具有另一个基

C++ cin 按键事件

c# - 将 Shift+1 转换为 ! C# 中的符号

c# - Linq 新语句有条件选择

c# - XMLSerializer - 添加到命名空间的类?

c# - 在哪里创建/获取/缓存 ViewModels?

java - 我怎样才能避免在 java 中做很多 if?

c++ - 将 -1 转换为无符号类型的可移植性如何?