Можно ли объявить / экспортировать статическую функцию в C ++ / CLI? - PullRequest
0 голосов
/ 20 января 2012

Например, я хотел сделать следующее:

namespace Test
{
    static bool PerformTest()
    {
        bool result = false;

        // Todo: do something

        return result;
    }
}

.. и затем вызвать эту функцию из другого модуля:

Test::PerformTest();

.. Я получаю сообщение о том, что PerformTestне является частью пространства имен.Если бы это был класс, я бы объяснил это отсутствующим «публичным» утверждением, но, насколько я могу судить, вы можете сделать общедоступными только классы ref и структуры?

Ответы [ 2 ]

4 голосов
/ 20 января 2012
static bool PerformTest()

Ключевое слово static означает разные вещи в разных контекстах. Здесь это означает «нет внешней связи», которая прямо противоположна вашей. Вы должны будете удалить это.

Не ясно, действует ли / clr при компиляции этого кода. Давайте предположим, что это так. CLR не поддерживает подобные свободные функции, он поддерживает только методы класса. Компилятор C ++ / CLI решает эту проблему путем создания фиктивного класса с именем <Module> в глобальном пространстве имен, превращая свободную функцию в метод этого класса, который является статическим и имеет внутреннюю доступность. И имя класса, и спецификатор доступности делают его недоступным для программы на C #. Отражение должно сработать, но я никогда не пробовал.

Существует одна задняя дверь, вы можете экспортировать бесплатную функцию так же, как вы можете в собственном проекте DLL. Тот же синтаксис:

extern "C" __declspec(dllexport) 
bool __stdcall PerformTest() { 
    // etc.. 
}

Компилятор C ++ / CLI экспортирует заглушку с тем же именем, что и функция, которую может вызывать любой собственный код. Заглушка загружает CLR, если требуется, переключается на выполнение управляемого кода и вызывает фактическую функцию PerformTest (). Любой код C # теперь может вызывать функцию. Затраты немного глупы, но это не должно иметь большого значения в тестовом сценарии.

1 голос
/ 20 января 2012

C # не позволяет статические функции на уровне пространства имен, вы должны поместить их в класс

код C #

namespace CLITest
{
    public static class Test
    {
        public static bool PerformTest()
        {
            bool result = false;

            // Todo: do something

            return result;
        }
    }
}

C ++ / код CLI

using namespace CLITest;

int main()
{

    Test::PerformTest();
    return 0;
}

будет делать то, что вы хотите

...