c++ CLI - C++/CLI:为什么在此方案中没有托管>非托管转换?
c++ cli - C++/CLI: Why is there no Managed->Unmanaged transition in this scenario?
假设我有一个使用/clr 开关编译的 C++/CLI 程序集。在该程序集中,存在调用同一程序集中定义的非托管(纯C++(类的托管类。使用 Visual Studio 进行调试并查看调用堆栈时,它会显示托管>非托管和非托管>托管转换发生的位置。
那么,引起我注意的是:当其中一个托管类从同一程序集调用其中一个非托管类时,为什么没有托管/非托管转换?这些非托管类是否以某种方式在幕后变成了托管类?
可能是因为您没有告诉编译器您希望将"非托管代码"编译为机器代码。 当/clr 生效时,所有代码都将编译为 IL。 它对标准C++代码没有问题,只有少数语言结构不受支持。
如果将代码混合在源代码文件中,则可以使用 #pragma 切换:
#pragma managed(push, off)
// Unmanaged code here
// ...
#pragma managed(pop)
// Your ref classes here
// ...
如果 #include 包含非托管代码声明的任何标头,也需要它。
它们不会编译为托管类型,但如果定义它们的源文件是使用 /clr
编译的并且不存在#pragma unmanaged
或#pragma managed (off)
,则它们将编译为 IL 而不是正确的本机代码。
就个人而言,我很少使用 /clr
编译整个项目,更喜欢仅在需要它的特定源文件上使用/clr
,以便非托管类型和函数确实编译为适当的本机代码。
相关文章:
- EASTL矢量<向量<int>>连续的
- 在 C++/CLI 中将 .NET 事件从一个 DLL 引发到另一个 DLL
- C++/CLI System.AccessViolation在托管类中调用非托管函数时出现异常
- 是否可以在Linux上使用.Net Core 3.1创建C++/CLI代码的C#DLL
- C++ DLL(不是 CLI)是否可以调用 .NET Core 3.0 委托?
- VS2010 C++ 调试托管 (C++/CLI) DLL
- 如何将 C++/CLI 库链接到C++应用程序
- C++/CLI targetting .NET Core 3.1
- 模板函数签名在 C++/CLI 中解包
- C++/CLI 混合托管/本机 DLL 不起作用
- C++/CLI 和 C#/VB 与不安全和外部有什么区别?
- 是否有可能构建面向Linux和Windows的.Net Core C++ / CLI应用程序?
- DirectX 12 和 C++ CLI :无法使用IID_PPV_ARGS
- 如何为要在 C# 中使用的静态库创建 C++ 或 C++/CLI 包装器
- 将 C# 对象(包含静态对象成员)作为参数传递给 C++/CLI 程序
- C++/CLI -- 访问结构成员
- 如何将字符串从 C++/CLI 方法返回到调用它的非托管C++
- 如何将CLI类的函数指针作为参数传递给C++方法
- 用于LabView中使用的本机c++的c++/cli dll包装器
- C#WPF和C++/CLI以及C++在C++/CLI中添加外部库错误