C++/CLI 什么 class 包含全局函数?
C++/CLI What class encloses global functions?
如果我没记错的话,函数必须是 CLR 世界中 class 的成员,而全局函数在 C++/CLI 中是可能的。这是否意味着这些全局函数是某种隐藏的 "global" class 的一部分?如果是这样,出于反思目的,人们将如何获取其类型?
它实际上是一个名为“”(带有尖括号)的 class,它不在任何命名空间中。这个 class 实际上存在于普通的 C# 程序集中。
是的,.NET 元数据支持全局函数和变量。在CLR源代码中称为"Global Class",它的名字是<Module>
。使用 C# 白话,它是 internal
、abstract
和 sealed
以确保您永远不会创建 class 的实例,尖括号有助于避免创建意外的重复类型.
技术上你可以反思一下,你需要BindingFlags.NonPublic和BindingFlags.Static。请记住这是多么不切实际,您需要使用损坏的 C++ 名称来查找任何内容。至少需要链接器 .map 文件或像 ildasm.exe 这样的反汇编程序才能知道名称。请注意,它非常混乱,对于典型的 C++/CLI 项目,许多 CRT 标识符最终会出现在 class 中。有点错误。
最后但并非最不重要的一点是,<Module>
中的代码几乎总是错误的。除了模糊的 reverse-pinvoke 原因,您总是希望在 ref class 中包含托管代码。如果您想反思一下,尤其如此。更令人担忧的是,将过多的本机 C++ 代码编译为 MSIL。它工作得很好,任何符合 C++03 的代码都可以编译为 MSIL,因此您不能说您基本上是两全其美。将 C++/CLI 与本机 C++ 代码严格分开很重要,使用静态库项目最容易做到。
如果我没记错的话,函数必须是 CLR 世界中 class 的成员,而全局函数在 C++/CLI 中是可能的。这是否意味着这些全局函数是某种隐藏的 "global" class 的一部分?如果是这样,出于反思目的,人们将如何获取其类型?
它实际上是一个名为“
是的,.NET 元数据支持全局函数和变量。在CLR源代码中称为"Global Class",它的名字是<Module>
。使用 C# 白话,它是 internal
、abstract
和 sealed
以确保您永远不会创建 class 的实例,尖括号有助于避免创建意外的重复类型.
技术上你可以反思一下,你需要BindingFlags.NonPublic和BindingFlags.Static。请记住这是多么不切实际,您需要使用损坏的 C++ 名称来查找任何内容。至少需要链接器 .map 文件或像 ildasm.exe 这样的反汇编程序才能知道名称。请注意,它非常混乱,对于典型的 C++/CLI 项目,许多 CRT 标识符最终会出现在 class 中。有点错误。
最后但并非最不重要的一点是,<Module>
中的代码几乎总是错误的。除了模糊的 reverse-pinvoke 原因,您总是希望在 ref class 中包含托管代码。如果您想反思一下,尤其如此。更令人担忧的是,将过多的本机 C++ 代码编译为 MSIL。它工作得很好,任何符合 C++03 的代码都可以编译为 MSIL,因此您不能说您基本上是两全其美。将 C++/CLI 与本机 C++ 代码严格分开很重要,使用静态库项目最容易做到。