【问题标题】:What are best practices for using IntPtr vs. void* in C++/CLI?在 C++/CLI 中使用 IntPtr 与 void* 的最佳实践是什么?
【发布时间】:2011-04-29 17:24:58
【问题描述】:

我使用它在程序集之间传递本机指针。不幸的是,强类型在这种情况下消失了。或者至少,我还没有弄清楚如何获得对 C++/CLI 方法的跨程序集访问,该方法返回指向本机 UDT 的指针。所以假设我是对的,这里需要IntPtrvoid*,我应该使用哪个?

【问题讨论】:

    标签: .net interop c++-cli


    【解决方案1】:

    总是首选CLS-compliant 路由,在本例中为IntPtr。并非所有 .NET 语言都知道 void* 是什么,但都知道 IntPtr 是什么。

    关于本机 UDT 的跨汇编使用,请参阅 #pragma make_public

    【讨论】:

    • Make_public 不适用于模板,所以我倾向于忽略它的存在。 :) 我的许多原生 UDT 是其他 UDT 的 shared_ptrs ! CLS 合规性角度很有趣,但我只在我的 C++/CLI 本机代码包装器中使用这些指针。完全可以将包装器传递给非指针语言,但非指针语言永远不需要使用指针。但是,它可能会将其传递回不同程序集中的 C++/CLI。这让我觉得 void* 更明确地说明了指针的用途。
    • 在任何非指针语言中使用 void* 会导致错误吗?
    • @Matt Chambers :无法调用任何从某些语言获取或返回 T* 的方法/属性。同样,不能从某些语言调用任何采用或返回除System::Byte 之外的无符号整数类型的方法/属性。是否关心这些语言取决于您。
    • @ildjarn:我实际上更喜欢对除 C++/CLI 之外的所有语言隐藏此特定方法。我最初使用的是内部访问级别,但当我开始需要跨程序集访问时不得不放弃它。是否有我不知道的 internal_except_for_cppcli 访问级别? :)
    • @Matt Chambers :不,但是如果您控制涉及的每个程序集,那么您可以使用InternalsVisibleTo attribute 授予逻辑程序集级别friendship。具体看这篇文章:Friend Assemblies (C++)
    猜你喜欢
    • 1970-01-01
    • 2010-09-06
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    相关资源
    最近更新 更多