Как переслать объявление метода в C ++ / CLI, чтобы он соответствовал сигнатуре метода «Managed Extensions for C ++», который принимает ссылку на управляемый тип - PullRequest
2 голосов
/ 03 ноября 2010

Я хотел бы вызвать метод, скомпилированный с /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.

Ответы [ 2 ]

1 голос
/ 23 ноября 2010

Я могу быть совершенно неправ, но разве мы не должны считать, что IL, созданный "Managed Extensions for C ++", сломан в первую очередь?Почему вы добавляете атрибут IsImplicitlyDereferenced к ссылочному параметру?

С этой точки зрения, я думаю, это ответ на вопрос, что вы, вероятно, не сможете создать точно такую ​​же сигнатуру с C ++ /CLI (но на самом деле это хорошо), и что ваша первая попытка действительно была правильной.

0 голосов
/ 03 ноября 2010

Возможно, вы захотите использовать ^ (System::DateTime^) - это объявляет управляемую ссылку в C ++ / CLI. Я ничего не знаю о / oldsyntax, но он принимает ссылку на тип CLR, поэтому я думаю, что это эквивалентно.

...