У меня есть простая библиотека .NET DLL, созданная с помощью VS2010 C #, которая предоставляет 2 статических члена класса
public class Polygon
{
public static void Test(int test) {}
public static void Test(List<int> test) {}
}
Затем я создал консольное приложение из VS2010 C ++ и добавил эту функцию выше _tmain
extern "C" void TestMe()
{
Polygon::Test(3);
}
Добавление ссылки и компиляция дает мне эту ошибку
1>WierdError.cpp(9): error C2526: 'System::Collections::Generic::List<T>::GetEnumerator' : C linkage function cannot return C++ class 'System::Collections::Generic::List<T>::Enumerator'
1> with
1> [
1> T=int
1> ]
1> WierdError.cpp(9) : see declaration of 'System::Collections::Generic::List<T>::Enumerator'
1> with
1> [
1> T=int
1> ]
1> WierdError.cpp(9) : see reference to class generic instantiation 'System::Collections::Generic::List<T>' being compiled
1> with
1> [
1> T=int
1> ]
Некоторые из моих наблюдений:
Test (List test)
в Test2 (List test)
Мой вопрос: что происходит не так и как исправить это из на стороне C ++.
Мой текущий обходной путь - переименовать метод в C #, но я бы предпочел не делать этого, у меня есть ощущение, что в моем проекте C ++ мне может не хватать параметра.
Изменить:
Я нашел лучший обходной путь в C ++, похоже, я могу обернуть вызовы .NET в другую функцию.
void wrapper()
{
Polygon::Test(3);
}
extern "C" void TestMe()
{
wrapper();
}
Это кажется глупым, мне интересно, не ошибка ли это компилятора? Что меня пугает, так это использование таких методов и необходимость беспокоиться о том, что разработчик C # может позже добавить такой статический метод и нарушить сборки C ++.