Я хотел бы вызвать метод, компилируемый с /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
который соответствует, за исключением дополнительного декларатора modopt MSIL, включенного в версию «Управляемые расширения для C ++»:
modopt([mscorlib]System.Runtime.CompilerServices.IsImplicitlyDereferenced)
Вторая попытка
Моя вторая попытка пересылки объявления этого метода в C ++ / CLI выглядела так:
MangToUnMangDateTime(System::DateTime & managedDT, tm& unmangDT);
В качестве примечания: я был удивлен, что это скомпилировано на C ++ / CLI, так как я ожидал, что он захочет, чтобы я использовал синтаксис% для управляемого типа. Это привело к следующему 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
Этот соответствует декларатору MSIL modopt, но является указателем *
вместо ссылки &
.
Вопрос:
Итак, есть ли у меня способ переслать объявление об этом в C ++ / CLI, чтобы оно соответствовало подписи в версии «Управляемые расширения для C ++»? Возможно, через атрибут в параметре?
Ограничения: я не хочу изменять версию «Управляемые расширения для C ++». Ясно, что если я изменю версию «Управляемые расширения для C ++», чтобы она передавалась по значению (что, вероятно, должно было быть в первую очередь):
void MangToUnMangDateTime(System::DateTime managedDT, tm& unmangDT);
тогда я могу получить сопоставление подписей, используя то же объявление в C ++ / CLI.