C ++ / CLI-> Ошибка C # C2526: функция связывания C не может вернуть класс C ++

У меня есть простая библиотека .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>          ]

Некоторые из моих наблюдений:

  • Он успешно компилируется, если я удаляю extern "C"
  • Он успешно компилируется, если я переименовываю Test (List test) в Test2 (List test)

Мой вопрос: что происходит не так и как исправить это из на стороне C ++.

Мой текущий обходной путь - переименовать метод в C #, но я бы предпочел не делать этого, у меня есть ощущение, что в моем проекте C ++ мне может не хватать параметра.

Изменить:

Я нашел лучший обходной путь в C ++, похоже, я могу обернуть вызовы .NET в другую функцию.

void wrapper()
{
    Polygon::Test(3);
}

extern "C" void TestMe()
{
    wrapper();
}

Это кажется глупым, мне интересно, не ошибка ли это компилятора? Что меня пугает, так это использование таких методов и необходимость беспокоиться о том, что разработчик C # может позже добавить такой статический метод и нарушить сборки C ++.

9
задан PeskyGnat 16 June 2011 в 19:57
поделиться