如何通过C++;对象到C# 寻找经验C++和C<的经验者的帮助 我现在写了一个C项目,它要求在内部库中调用现有的C++函数,并且遇到一些困难。

如何通过C++;对象到C# 寻找经验C++和C<的经验者的帮助 我现在写了一个C项目,它要求在内部库中调用现有的C++函数,并且遇到一些困难。,c#,c++,C#,C++,C++代码函数头(无法更改) typedef int(*PTR_func) (const char*param1,//输入 const char*param2,//输入 VirtualInternalString和po_输出);//第三个参数实际上是输出 内部字符串对象的C++代码类(无法更改) 名称空间内部库 { 类VirtualInternalString { 公众: virtual~VirtualInternalString(){}; 虚空_cdeclsetstring(const ch

C++代码函数头(无法更改)

typedef int(*PTR_func)
(const char*param1,//输入
const char*param2,//输入
VirtualInternalString和po_输出);//第三个参数实际上是输出
内部字符串对象的C++代码类(无法更改)

名称空间内部库
{
类VirtualInternalString
{
公众:
virtual~VirtualInternalString(){};
虚空_cdeclsetstring(const char*)=0;
虚拟常量char*_cdeclc_str()常量=0;
};
类SafeInternalString:公共虚拟InternalString
{
公众:
SafeInternalString():字符串(“”{};
虚拟~SafeInternalString(){};
虚空_cdeclsetstring(const char*chararray){TheString=chararray;};
virtual const char*_cdeclc_str()const{return TheString.c_str();};//这是std::string
受保护的:
std::字符串字符串;
};
类SafePtrString:public VirtualInternalString
{
公众:
SafePtrString():PtrString(0){};
SafePtrString(std::string&str):PtrString(&str){};
virtual~SafePtrString(){};
虚空_cdeclsetstring(const char*chararray){(*PtrString)=chararray;};
虚拟常量char*_cdeclc_str()常量{return PtrString->c_str();};
受保护的:
std::string*PtrString;
};
}
现在我必须在我的C代码中使用这个“func”。我可以正确调用和使用C++函数,但是在输出返回(第三PARAM)时会出现问题。它应该是与问题相关的返回类型

C#(可以更改)

[DllImport(“xxxxlib”,CallingConvention=CallingConvention.Cdecl)]
私有外部静态int func(字符串参数1,
字符串参数2,
[Marshallas(UnmanagedType.LPStr)]StringBuilder res);//这里有问题
<>我知道我必须创建一个合适的包装器来将C++对象分解为C字符串,但是我没有以前的经验。我在网上尝试过几种解决方案,但都不起作用

有人知道我如何实现这一点吗?你介意给我看一些简单的C#框架代码吗?

如果你只更改C#端,vasek的就不起作用了。但是你可以做的是在C++中创建包装,创建原始代码<代码> char */COD>关联的<代码>长度< /Cord>参数> < /P>

创建一个附加的C++头和源,其中包含:

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\u func

我认为在这种情况下使用C++/CLI是有意义的。您可能想在本机C++ DLL和C代码之间建立一个极小的<强> C++ /CLI桥<强>。

C++ +CLI层负责将自定义C++字符串类作为DLL函数的输出参数,并将此自定义字符串转换为C·{/.NET字符串对象。

您的自定义C++字符串类似乎包装 STD::String ;另一方面,C#/.NET字符串使用Unicode UTF-16作为其文本编码,因此您可能需要在Unicode UTF-8(存储在
std::string
和自定义字符串类中)和UTF-16(用于C#/.NET字符串)之间进行转换


同样,在C++ /CLI桥接层中,还需要将C++的UTF-16字符串转换为UTF-8,并将这些UTF-8编码的字符串作为你的代码> const char */COD>输入参数传递给本地DLL函数。

< P>使用C++ COM,并从C代码中消费。只有当你在windows平台上时。

在过去的经验中,我确实使用了SWIG工具来实现生成包装器 它支持C++对几种语言的包装生成,其中java是最流行的语言。 有一个很棒的教程- 也支持C#-

然后调用swig生成包装文件:

swig -csharp InternalLib.i

我不是几分钟前才看到这个问题吗?是你把它贴出来然后删除的吗?如果是这样的话,请不要这样做。相反,你应该编辑你已经有的问题。可能重复的抱歉关于。。。你知道这个帖子吗?目标是在返回的C++对象中获取字符串。这应该不难,但我真的尝试了不同的方法,并努力了很多。它仍然不起作用P/Invoke仅适用于与Win32 API使用的API类似的API。它只能翻译符合它所知道的翻译方法的C风格的函数和结构。对于任何像这样复杂的事情,你都需要。C++/CLI桥。或者,您可以公开符合P/Unjk支持的函数。建议的Vasek复制不覆盖此情况,因为在POST中的对象不能在C++和C语言之间进行封送。需要更多的信息来解释为什么它不可能,如何弥合差距。困难的部分是C++函数返回一个虚拟的内部字符串和对象,并且使用这个函数不需要简单的C语言初始化。你的意思是我可以创建另一个C++函数,将对象中的char *暴露到外部世界吗?确切地说,你创建的额外的<代码> FUNC< /Cux>包装器将“<代码> char */COD>”暴露给外面的世界,同时处理内部的 ValualIntualStudio> < /Cord>对象。更准确地说,您需要将数据从
VirtualInternalString&
复制到C#提供的缓冲区。别忘了检查缓冲区长度@乘客很乐意提供帮助,如果此答案解决了您的问题,请单击答案旁边的复选标记将其标记为已接受。请看:更多信息,您是否希望
swig -csharp InternalLib.i