Я хотел бы вызвать метод, скомпилированный с /clr:oldsyntax
(управляемые расширения для синтаксиса C ++) из кода c ++, скомпилированного с /clr
(C ++ / CLI). Однако у меня возникают проблемы с объявлением метода в C ++ / CLI таким образом, чтобы он совпадал с сигнатурой «Managed Extensions for C ++».
Объявление в версии с использованием «Managed Extensions for 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
, что соответствует за исключением дополнительного объявления MSIL modopt, включенного в версию "Managed Extensions for 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, чтобы он соответствовал подписи в версии "Managed Extensions for C ++"? Возможно, с помощью атрибута параметра?
Ограничения : Я не хочу изменять версию "Managed Extensions for C ++". Ясно, что если я изменю версию «Managed Extensions for C ++», чтобы она передавалась по значению (что, вероятно, должно было быть в первую очередь):
void MangToUnMangDateTime(System::DateTime managedDT, tm& unmangDT);
тогда я могу получить сигнатуры для сопоставления, используя то же объявление в C ++ / CLI.