Изменение типа возврата в сгенерированной функции CS с помощью SWIG - PullRequest
3 голосов
/ 06 февраля 2020

Я пытаюсь сгенерировать оболочки в C# для библиотеки C ++ и использую сгенерированные оболочки C3. Я разрабатываю клиентское приложение.

C ++ class:

namespace ns {
    class ISampleInterface {
        public:
            virtual ~ISampleInterface() {}
            virtual void fn(int cnt) = 0;
    };
}

namespace ns {
    class ISampleInterface2 {
        public:
            virtual ~ISampleInterface() {}
            virtual void fn2(int cnt) = 0;
    };
}

namespace ns {
    class SampleClass  {
        public:
            SampleClass() {}
            ~SampleClass() {}
            void InputFunction(int count, ISampleInterface sampleInterface, ISampleInterface2& sampleInterface2){
            }
            ISampleInterface& OutputFunction(void) {
                return null;
            }
    };
}

Ожидаемый C# код:

namespace csNS {
    public class SampleClass {
        public void InputFunction(int count, out SampleInterface sampleInterface, out SampleInterface2 sampleInterface2) {
            // some code
        }
        public SampleInterface OutputFunction() {
            // some code 
        }
    }
}

Объявление интерфейса Swig:


%interface_custom("SampleInterfaceImpl", "SampleInterface", ns::ISampleInterface);
%interface_custom("SampleInterface2Impl", "SampleInterface2", ns::ISampleInterface2);

%Outparams(ns:ISampleInterface, SampleInterfaceImpl)
%Outparams(ns:ISampleInterface2, SampleInterface2Impl)

В коде выше C#, InputFunction принимает 3 аргумента. Однако реализация, созданная для SampleInterface и SampleInterface2, не содержит конструктор по умолчанию. Следовательно, я не могу создавать объекты для этих интерфейсов. Поскольку я не могу создать экземпляр интерфейсов на стороне C#, я хочу затем передать их в качестве параметра out функции CS, а затем он будет инициализирован на стороне C ++. Таким образом, чтобы изменить файл cs, сгенерированный во время компиляции swig ниже карты типов, которую я определил

Объявления карты типов:

%define %Outparams(TYPE, InterfaceImpl)

%typemap (cstype) TYPE,
                  TYPE &,
                  TYPE *,
                  TYPE *& "out TYPE"
%enddef

Используя приведенную выше карту типов, я могу изменить входные аргументы, однако она также меняет возвращаемые значения функции, и я не могу контролировать это.

Фактический сгенерированный код CS:

namespace csNS {
    public class SampleClass {
        public void InputFunction(int count, out SampleInterface sampleInterface, out SampleInterface2 sampleInterface2) {
            // some code
        }
        public out SampleInterface OutputFunction() {
            // some code 
        }
    }
}

Что я делаю неправильно ???

1 Ответ

1 голос
/ 09 февраля 2020

Я изменил объявление карты типов, оно сработало.

Для класса:

%typemap (cstype, out="TYPE") TYPE,
                  TYPE &,
                  TYPE *,
                  TYPE *& "out TYPE" 

Для интерфейса:

%typemap (cstype, out="InterfaceImpl") TYPE,
                  TYPE &,
                  TYPE *,
                  TYPE *& "out InterfaceImpl"

Файл CS:

namespace csNS {
    public class SampleClass {
        public void InputFunction(int count, out SampleInterface sampleInterface, out SampleInterface2 sampleInterface2) {
            // some code
        }
        public SampleInterfaceImpl OutputFunction() {
            // some code 
        }
    }
}
...