我读过(在 Nish Sivakumar 的书 C++/CLI In Action 等地方),如果您知道,您应该在函数调用上使用 __clrcall 装饰器来避免双重转换该方法永远不会从非托管代码中调用。 Nish 还表示,如果方法签名包含任何 CLR 类型,那么 JIT 编译器将自动添加 __clrcall。我不清楚的是,在创建 C++/CLI 属性时是否需要包含 __clrcall。从某种意义上说,属性只能从 .NET 语言访问,另一方面,C++/CLI 编译器(我认为)只是生成可从托管和非托管代码调用的方法(例如 ***_get() )。那么我是否需要在属性上使用 __clrcall 修饰符?如果需要,它会去哪里?关于 get/set 函数本身?
最佳答案
@Mike B - 感谢有关 ildasm 的提示 - 我不知道该工具。
看来我误读/误解了 Nish - __clrcall 修饰符和它消除的双重转换问题仅适用于 NATIVE 类的方法。默认情况下,托管类的所有方法都是 __clrcall - 回想起来,这似乎很明显。
显然,Marcus Heege 的书 Expert C++/CLI 已上市 as a free download ,第 215 页有一个很好的表格,总结了调用约定。
关于.net - 避免使用 C++/CLI 属性进行双重转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/86977/