c# - C# 托管代码和 C++ 非托管代码之间字符串的混合编程

标签 c# wrapper unmanaged managed string-conversion

我正在开发一个使用字符串路径调用 XML 文件的 C++ 项目。当我编译 C++ 时,一切都完美运行,并且我能够根据我的项目需要使用 XML 文件。

我需要使用 C# GUI,所以我制作了一个包装器来从我的 C++ 文件中调用我的所有函数。在两个平台之间调试后出现一个问题,c# 无法识别调用我的文件的字符串路径,我得到的错误是它找不到给定的路径。有谁知道如何在两个平台之间发送有效的字符串路径?

提前致谢, 卡罗来纳州

    int ClassUnmanaged::ReadFile(string path_to_file)
     {
        int status = XMLClass->ReadConfigFile(path_to_file);

        if(status)
        {
           return status; //Error
        }

        else
        {
           return 0;
        }
    }

C++类的Wrapper.h

    public __gc class Wrapper
    {

      public:   Wrapper(void);
      public:   ~Wrapper(void);
             /** Unmanaged pointer to Class Unmanaged API
               *    
               */
      private:  ClassUnmanaged__nogc* pointerUnmanaged;

          public: int NewReadfile(string path_to_file);
    }

包装器.cpp

    int Wrapper::NewReadFile(string path)
    {
        pointerUnmanaged->ReadFile(path);//here i access to my class unmanaged
    return 0;
     }

用户界面.cs

在 UI.cs 中,由于 c++ 使用的字符串类型,我无法从包装器调用函数 NewReadfile。知道如何解决这个问题吗?

最佳答案

您需要将 NewReadFile 方法更改为 public,然后将其更改为将 C# 知道的类型作为输入,例如 Sytem::String 它应该如下所示(使用新的托管 C++如果需要,语法适应旧语法)

int Wrapper::NewReadFile(System::String^ path)
{
    char* pathAsCharArray = (char*)(void*)Marshal::StringToHGlobalAnsi(str);
    try
    {
        std::string pathAsStdString(pathAsCharArray);
        pointerUnmanaged->ReadFile(pathAsStdString);
    }
    finally
    {
        Marshal::FreeHGlobal(pathUnmanaged);
    }

    return 0;
 }

有一篇名为 "How to convert from System::String* to Char* in Visual C++" 的知识库文章解释这个概念。如果您的底层 API 可以支持 unicode 并且您使用新语法,则更好的转换方法如下:

pin_ptr<const wchar_t> pathAsCharArray = PtrToStringChars(path);
std::wstring pathAsStrign(pathAsCharArray);

关于c# - C# 托管代码和 C++ 非托管代码之间字符串的混合编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6895530/

相关文章:

python - 用 swig 包装时避免 "unused typedef"警告

DirectX 托管还是非托管?

c# - 持久事件在 wf4 工作流程中失败

android - 在 Android 中制作文本转语音包装器

c# - 在 Asp.net 中使用 HTML5 的拖放上传文件

.htaccess - Joomla 包装器和 SSL

c# - 在 C# 中使用 DllImport 的最佳方法以及如何从外部方法取回控制权

c# - 如何将 UDT 的 SAFEARRAY 传递给 C# 中的非镜像代码

c# - 为什么 "dynamic"需要特定于语言的运行时组件?

c# - MySQL、EF6 和 Database.CreateIfNotExists