C++ cli 如何在C++/CLI以匹配“的签名”;C++&引用;方法,该方法引用托管类型 < >我想调用一个用C++编写的代码,用代码< > CL/OL:OLFordSuths//>(C++ C++的托管扩展),代码是用代码> /CLR < /C> >(C++/CLI)编译的。但是,在C++/CLI中声明该方法时遇到了问题,无法使其与“C++托管扩展”签名匹配

C++ cli 如何在C++/CLI以匹配“的签名”;C++&引用;方法,该方法引用托管类型 < >我想调用一个用C++编写的代码,用代码< > CL/OL:OLFordSuths//>(C++ C++的托管扩展),代码是用代码> /CLR < /C> >(C++/CLI)编译的。但是,在C++/CLI中声明该方法时遇到了问题,无法使其与“C++托管扩展”签名匹配,c++-cli,cil,managed-c++,C++ Cli,Cil,Managed C++,使用“C++托管扩展”的版本中的声明如下所示: void MangToUnMangDateTime(System::DateTime & managedDT, tm& unmangDT); 注意:第一个参数(managedDT)是此问题的相关参数。这将导致该方法的以下msil(使用ildasm.exe找到): 第一次尝试: 我第一次尝试在C++/CLI中向前声明此方法,结果如下所示: void MangToUnMangDateTime2(System::DateTime % m

使用“C++托管扩展”的版本中的声明如下所示:

void MangToUnMangDateTime(System::DateTime & managedDT, tm& unmangDT);
注意:第一个参数(managedDT)是此问题的相关参数。这将导致该方法的以下msil(使用ildasm.exe找到):

第一次尝试: 我第一次尝试在C++/CLI中向前声明此方法,结果如下所示:

void MangToUnMangDateTime2(System::DateTime % managedDT, tm& unmangDT);
MangToUnMangDateTime(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
.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++托管扩展”版本中包含的附加modopt MSIL声明程序外,其他哪些匹配:

第二次尝试 我第二次尝试在C++/CLI中向前声明此方法,结果如下所示:

void MangToUnMangDateTime2(System::DateTime % managedDT, tm& unmangDT);
MangToUnMangDateTime(System::DateTime & managedDT, tm& unmangDT);
顺便说一句,我很惊讶这是用C++/CLI编译的,因为我希望它希望我在托管类型上使用%语法。这导致了以下msil:

.method assembly static void  MangToUnMangDateTime(valuetype [mscorlib]System.DateTime& managedDT,
                                                    valuetype tm* modopt([mscorlib]System.Runtime.CompilerServices.IsImplicitlyDereferenced) unmangDT) cil managed
.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++托管扩展”版本修改为按值传递(可能首先应该是值传递):


然后,我可以通过在C++/CLI中使用相同的声明来获得匹配的签名。

您可能希望使用^(
System::DateTime^
)-这在C++/CLI中声明了一个托管引用。我对OLD语法一无所知,但它引用了CLR类型,所以我认为这是等价的。

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


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

呃,不,DateTime是一种值类型。^应仅用于引用类型。这是不正确的。这将生成以下msil:。方法程序集静态void MangToUnMangDateTime(类[mscorlib]System.ValueType modopt([mscorlib]System.DateTime)modopt([mscorlib]System.Runtime.CompilerServices.IsBoxed)managedDT,ValueType tm*modopt([mscorlib]System.Runtime.CompilerServices.ismplicitlydereferenced)unmangDT)cil managedStop从另一个程序集转发声明类型。只需添加一个引用即可。这不再是C,不需要头文件。@Hans:这没有任何意义——这不是C,它是C++/CLI,所以仍然有头文件。这个方法在同一个程序集中,它只是在另一个编译单元中。一个编译单元的头文件是用“C++托管扩展”语法(/clr:oldsyntax)编写的。我想从中调用该方法的编译单元是C++/CLI语法(/clr)。因此,我不能包含“托管扩展”标题,因为在/clr下编译无法理解/clr:oldsyntax语法。它们不必在同一个项目中。制作两个DLL。@Hans:我等着看我的问题是否有答案。谢谢。我想它可能被认为是“坏的”或“过时的”。但是,我希望至少有一种方法让我向前宣布它,并从同一个大会上召集它。也许不是。