CLR中的类型转换

发布于:2025-03-18 ⋅ 阅读:(20) ⋅ 点赞:(0)

  • CLR(Common Language Runtime,公共语言运行时)是微软.NET框架的核心组件,是微软对 CLI 标准的具体实现,负责管理和执行托管代码,提供跨语言互操作性、内存管理、安全性等关键服务
  • CLR的类型转换机制是.NET框架中实现类型安全与多语言互操作的核心功能之一
  • 若调试不能命中,可参考 C# 通过 CLR 调用 C++ 代码无法命中断点问题解决
  • CLR中的marshal_as 介绍

字符串类型转换

  • marshal_as 是 C++/CLI 中用于数据类型转换的工具,用于托管代码和非托管代码之间进行数据类型的转换
  • C# 和 C++ 的字符串类型使用marshal_as相互转换
  • 要使用#include <msclr/marshal_cppstd.h> 头文件,以便使用marshal_as函数进行字符串类型转换
#include <msclr/marshal_cppstd.h> 
#include <iostream>

using namespace System;
using namespace msclr::interop;

int main(array<System::String ^> ^args)
{
   
    // 托管到非托管的转换
    System::String^ managedString = "Hello, World!";
    std::string unmanagedString = marshal_as<std::string>(managedString);
    Console::WriteLine("Managed string: {0}", managedString);
    std::cout << "Unmanaged string: " << unmanagedString << std::endl;

    // 非托管到托管的转换
    std::string anotherUnmanagedString = "Hello from unmanaged code!";
    System::String^ anotherManagedString = marshal_as<System::String^>(anotherUnmanagedString);
    Console::WriteLine("Another unmanaged string converted to managed: {0}", anotherManagedString);

    return 0;
}

容器类型转换

  • gcnew 是 C++/CLI(托管 C++)中用于 ​托管堆 上分配内存的关键字,用于创建由 ​垃圾回收器(GC)​ 自动管理的托管对象。与 C++ 的 new 不同,gcnew 分配的内存无需手动释放,由 CLR 的 GC 自动回收,避免内存泄漏风险
  • gcnew 返回的是对象的 ​句柄(Handle)​,用符号 ^ 表示(类似于C++的指针 *)
#include "pch.h"
#include <msclr/marshal_cppstd.h> 
#include <iostream>
#include <vector>

using namespace</

网站公告

今日签到

点亮在社区的每一天
去签到