SWIG Down В ролях в C # - PullRequest
       33

SWIG Down В ролях в C #

0 голосов
/ 11 марта 2019

В C ++ у меня есть три класса, которые наследуются друг от друга, и фабрика. Я пытаюсь использовать SWIG для создания оболочки C # и столкнулся с некоторыми трудностями. Собака наследуется от Зверя. DogFactory возвращает указатель на животное, которое действительно является собакой. C # не может правильно привести животное, сделанное на этой фабрике, в экземпляр Dog. Было предложено решение заставить C # работать в ЗДЕСЬ .

//Zoo.h file    
%module Zoo
%{
#include "ZooNative.h"
%}
%include "ZooNative.h"
%pragma(csharp) imclasscode=%{
    public static Animal InstantiateConcreteAnimal(System.IntPtr cPtr, bool owner)
    {
        Animal ret = null;
        if (cPtr == System.IntPtr.Zero)
        {
            return ret;
        }
        uint[] typeIDs = { 0, 1};
        int typeID = -1;
        foreach (int id in typeIDs)
        {
            bool typeMatch = $modulePINVOKE.Animal_IsTypeOf(new System.Runtime.InteropServices.HandleRef(null, cPtr), id) == 1;
            if (typeMatch)
            {
                typeID = id;
                break;
            }
        }
        if (typeID != -1)
        {
            switch(typeID)
            {
                case 0:
                    return new Animal(cPtr, owner);
                case 1:
                    return new Dog(cPtr, owner);
            }
        }
        System.Diagnostics.Debug.Assert(false, "Failed to find the type for the pointer");
        return ret;
    }
%}

%typemap(csout, excode=SWIGEXCODE) Dog*{
    IntPtr cPtr = $imcall;
    $csclassname ret = ($csclassname) $modulePINVOKE.InstantiateConcreteAnimal(cPtr, $owner);$excode
    return ret;
}
...