CLR中的类型转换
- 字符串类型转换
- 容器类型转换
- 自定义类型相互转换
- 项目设置
- 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</