我想调用一个正在编译的方法
/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++中的声明来匹配签名。