Я пытаюсь сгенерировать оболочки в 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
}
}
}
Что я делаю неправильно ???