代码之家  ›  专栏  ›  技术社区  ›  Matt Smith

如何在C++/CLI中声明一个方法来匹配一个引用托管类型的“托管扩展名为C++”方法的签名

  •  2
  • Matt Smith  · 技术社区  · 14 年前

    我想调用一个正在编译的方法 /clr:oldsyntax (C++语法的托管扩展)来自编译的C++代码 /clr (C++/CLI)。但是,在C++/CLI中声明方法是困难的,因此它与“C++的托管扩展”签名匹配。

    使用“托管扩展C++”的版本中的声明看起来像:

    void MangToUnMangDateTime(System::DateTime & managedDT, tm& unmangDT);
    

    注意:第一个参数(manageddt)是这个问题感兴趣的参数。 这将导致该方法的以下msil(使用ildasm.exe找到):

    .method assembly static void  MangToUnMangDateTime(valuetype [mscorlib]System.DateTime& modopt([mscorlib]System.Runtime.CompilerServices.IsImplicitlyDereferenced) managedDT,
                                                       valuetype tm* modopt([mscorlib]System.Runtime.CompilerServices.IsImplicitlyDereferenced) unmangDT) cil managed
    

    第一次尝试:

    我第一次在C++/CLI中声明这个方法的尝试看起来像:

    void MangToUnMangDateTime2(System::DateTime % managedDT, tm& unmangDT);
    

    这导致了以下MSIL:

    .method assembly static void  MangToUnMangDateTime(valuetype [mscorlib]System.DateTime& managedDT,
                                                        valuetype tm* modopt([mscorlib]System.Runtime.CompilerServices.IsImplicitlyDereferenced) unmangDT) cil managed
    

    除了在“C++扩展托管版本”中包含的附加MODopt MSIL声明符之外,还有哪些匹配项:

    modopt([mscorlib]System.Runtime.CompilerServices.IsImplicitlyDereferenced) 
    

    第二次尝试

    我的第二次尝试在C++和CLI中声明这个方法看起来像:

    MangToUnMangDateTime(System::DateTime & managedDT, tm& unmangDT);
    

    作为一个旁注,我在C++中对这个编译过了,因为我希望它能让我在托管类型上使用%语法。 这导致了以下MSIL:

    .method assembly static void  MangToUnMangDateTime(valuetype [mscorlib]System.DateTime* modopt([mscorlib]System.Runtime.CompilerServices.IsImplicitlyDereferenced) managedDT,
                                                       valuetype tm* modopt([mscorlib]System.Runtime.CompilerServices.IsImplicitlyDereferenced) unmangDT) cil managed
    

    这个匹配modopt msil声明符,但是是一个指针 * 而不是引用 & .

    问题:

    那么,有没有办法让我在C++/CLI中声明它来匹配“C++扩展托管版本”中的签名呢? 可能通过参数上的属性?

    约束条件 我不想修改“C++的托管扩展”版本。很明显,如果我修改了“C++的托管扩展”版本的值(它可能本来应该是第一个):

    void MangToUnMangDateTime(System::DateTime managedDT, tm& unmangDT);
    

    然后我可以通过使用C++中的声明来匹配签名。

    2 回复  |  直到 14 年前
        1
  •  1
  •   icecrime    14 年前

    我可能完全错了,但是我们不应该首先考虑“C++托管扩展”所产生的IL吗?你为什么要加一个 IsImplicitlyDereferenced 属性到引用参数?

    从这个角度来看,我猜这是一个答案,说明你可能无法用C++ +CLI产生完全相同的签名(但这实际上是一件好事),而且你的第一次尝试确实是正确的方法。

        2
  •  0
  •   Puppy    14 年前

    你可能想用^( System::DateTime^ -这在C++/CLI中声明了托管引用。我对/oldsyntax一无所知,但它引用了一个clr类型,所以我认为这是等价的。

    推荐文章