在 c++ 中为非托管 c# dll 使用 std::string

Posted

技术标签:

【中文标题】在 c++ 中为非托管 c# dll 使用 std::string【英文标题】:Using std::string in c++ for unmanaged c# dll 【发布时间】:2016-05-24 12:03:02 【问题描述】:

我正在尝试为客户端提供的 c++ SDK 设置用于 c# 的非托管 DLL 包。此 SDK 使用 std::string 和 std::wstring 变量。我发现很难/不可能为此使用像 string 和 wstring 这样的 STL 变量,但这是我最后的手段。我真的希望有人能告诉我为使用 std::string 和 std::wstring 的 c++ 方法构建 c# dll 包装器的可能方法。

【问题讨论】:

在 C++ 中很难,只有在使用 exact 相同的 C++ 编译器和 exact 相同的构建设置时才能工作。只有在您拥有源代码或为您提供多个构建的高度纪律的软件供应商时,这才在实践中有效。在 C# 中是不可能的,你不能创建/销毁/解释这些 C++ 模板类对象。您需要一个 C++/CLI 包装器,请务必与库供应商合作以获得您需要的东西。 我正在使用确切的 c++ 编译器,所以幸运的是这不是问题。但也许对于未来的规划,使用 c++/cli 可能是个好主意。 您好像错过了消息,必须使用 C++/CLI。没有规划,未来就是今天。并且不要忽略完全相同的构建设置要求,Debug 和 Release 构建设置之间的差异已经足以破坏内存。 我知道构建设置必须相同,但我确信它们在这一点上。我的意思是,除了我确定不是构建设置有问题之外,使用 C++/CLI 而不是非托管包装器是一个好主意,因为我不能确定在未来。 Hans Passant,我认为你是对的,所以你可以将你的答案作为答案发送,以便我标记它。也许有一些方法可以实现这一点,但我不认为我走在正确的道路上,我会尝试 C++/CLI 方法。非常感谢 【参考方案1】:

您是否尝试过将std::string 转换为System::String^,如MSDN docs 中所述

【讨论】:

我想这样做,但 SDK 已经使用了我无法更改的方法,这些方法使用 std::string

以上是关于在 c++ 中为非托管 c# dll 使用 std::string的主要内容,如果未能解决你的问题,请参考以下文章

本机 C++ 通过代理 C++ 托管 dll 使用 C# dll

使用来自 C# 的托管 C++ dll

如何使用 std::vector 作为 C# 的参数调用非托管 C++ 函数?

在 C# 中为 p/invoke 创建一个基本的 C++ .dll

C#调用C++编写的DLL(非托管)

使用 C# 访问非托管 C++ DLL 时出现 AccessViolationException