gpt4 book ai didi

c# - C++/CLI 字符串互操作

转载 作者:太空狗 更新时间:2023-10-29 23:09:24 25 4
gpt4 key购买 nike

我正在为原生 C++ 类开发 C++/CLI 包装器。 C++/CLI 包装器正在 WPF 应用程序中使用。我在尝试编码字符串时遇到了一个奇怪的问题。

WPF 应用程序将 System::String 对象传递到我的包装器。然后包装器将 System::String 转换为 native 类期望的 std::string。这一切都很好,但是一旦我将字符串传递给 native 对象,它就是空的。

这里是一些相关的代码

WPF 事件处理程序 (C#)

private void tbInputConfig_TextChanged(object sender, TextChangedEventArgs e)
{
_OrionBasicApp.ConfigTemplateFile = tbInputConfig.Text;
}

包装类中的属性 (C++/CLI)

void BasicApp::ConfigTemplateFile::set(String ^value)
{
std::string val = marshal_as<std::string>(value);
_NativeApp->setConfigTemplateFile(val);
}

native 代码 (C++)

void Basic_App::setConfigTemplateFile(const std::string& template_file)
{
m_gParams.configTemplateFile = template_file;
}

因此,当我中断 WPF 应用程序并使用调试器进行跟踪时,String 对象看起来不错,std::string val 编码(marshal)处理看起来不错,但是参数 template_filesetConfigFile 函数中是一个空字符串。当我跳出 native 函数时,我可以看到 std::string val 变量看起来仍然正常。

我试过使用 Marshal::StringToHGlobalAnsi 函数,它产生相同的结果。我已经尝试更改 native 函数以获取字符串的副本而不是引用,这会产生有关无效内存块的异常(如果需要,我会发布确切的消息)。我试过在堆上分配字符串,没有运气。

现在更重要的是: native 代码是用 Microsoft Visual Studio 2008 编译的,wrapper + wpf 代码是用 2010 编译的。我希望这不是问题,因为我们很难将任何一个代码库迁移到另一个版本。

有什么想法吗?

更新

我能够将 native 代码切换到 visual studio 2010,这确实解决了问题。 (为什么微软必须让我的生活变得如此困难?)虽然我确实构建了系统,但该项目的负责人给我带来了关于这个解决方案的主要麻烦(他担心它可能无法正确运行或者我们将不得不切换依赖库)。

那么有没有解决这个问题的方法,而不是强制我切换 visual studio 版本?

最佳答案

跨 DLL 边界传递 C++ 对象不是一个好主意。 std::string 不是导致您的问题的相同类型、布局或实现。

如果您跨越 DLL 边界传递 BSTR(SysStringAlloc 等)或原始 char*,并转换为 std::string 在 native 代码中而不是在包装器中,您的问题就会消失。

此问题并非特定于 .NET 或 C++/CLI。任何将 std::string 实例从任何其他编译器版本传递到您的 native DLL 的尝试都将失败。

示例修复:

void BasicApp::ConfigTemplateFile::set(String ^value)
{
std::string val = marshal_as<std::string>(value);
_NativeApp->setConfigTemplateFile(val.c_str(), val.size());
}

void Basic_App::setConfigTemplateFile(const char* template_file_content, size_t template_file_length)
{
m_gParams.configTemplateFile = std::string(template_file_content, template_file_length);
}

关于c# - C++/CLI 字符串互操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12111964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com