2013-03-12 2 views
6

Есть два проекта, один C++ CLI и другой C#.
Проект C# имеет ссылку на проект C++ CLI.Что такое эквивалент ключевого слова C# в C++ CLI?

В C# я хочу сделать это:

//method signature is somemethod(dynamic data); 
somemethod("haaaii"); 

Теперь метод, который находится в проекте CLI C++ должен справиться с этим.

Как объявить этот метод в C++ CLI?
Также как определить тип данных в C++ CLI?

+0

Какие версии C++ и C# вы используете точно? –

+0

@Ramhound C++ CLI, который поставляется с 'Visual Studio 2012' и C#, который поставляется с' Visual Studio 2010' –

+0

Итак, вы пытаетесь в основном ссылаться на сборку .NET Framework 4.0 в сборке .NET FRamework 4.5, которая является проблемой. Вы хотя бы нацелены на ту же версию .NET Framework? –

ответ

6

Чтобы получить сигнатуру метода, который C# видит, как dynamic:

void TestMethod([System::Runtime::CompilerServices::DynamicAttribute] System::Object^ arg) 
{ 
} 

Но если вы просто хотите, чтобы принимать все типы, вы можете просто использовать System::Object^. Атрибут вводит в заблуждение, так как он подразумевает семантику, которую вам очень сложно предоставить.

Чтобы узнать фактический тип данных, используйте arg->GetType(). Затем вы можете использовать всю силу отражения и/или DLR для обнаружения и вызова элементов во время выполнения.

Немного более полезно использовать атрибут для возвращаемого типа, так как тогда C# будет вызывать семантику dynamic, когда используется ключевое слово var.

[returnvalue: System::Runtime::CompilerServices::DynamicAttribute] 
System::Object^ TestReturn(void) 
{ 
    return 1; 
} 
+0

это очень ценно; вы сэкономили много времени; Спасибо большое. –

0

Вы могли бы получить динамический с System::Dynamic::DynamicObject типа

void somemethod(ref System::Dynamic::DynamicObject data) { }

+0

Я пробовал это без успеха. Кажется, что ссылка 'DynamicObject' нужна для' Linq' –

+2

Скорее 'System :: Dynamic :: DynamicObject ^'. Нет, он не должен нуждаться в LINQ. Но вам нужно будет ссылаться на DLR, содержащиеся в сборках System.Core.DLL. –

Смежные вопросы