lorenzo todeschi Ответов: 3

Используйте dllimport для расширенного класса


У меня есть этот код:

С++:
class testfunction {
  public:
	virtual double operator()(double) = 0;
};


и я хочу использовать этот класс В C#, например

С#
class myCSharpClass: testfunction
{
}


Как я могу это сделать?

Что я уже пробовал:

extern "C"
{
  class testfunction {
  public:
	virtual double operator()(double) = 0;
  };
}

Philippe Mori

Вы не можете получить производную от неуправляемого класса В C#. Поэтому, если это то, что вы хотите сделать, то вам нужно написать управляемый класс на C++/CLI...

Кроме того, насколько я знаю, C# do не позволяет переопределять оператор () (и я не уверен, что это возможно для управляемых классов C++), поэтому вам, возможно, придется переименовать эту функцию...

3 Ответов

Рейтинг:
19

Philippe Mori

Одним из решений было бы Использование шаблона моста.
Шаблон проектирования программного обеспечения - Википедия, свободная энциклопедия[^]
Шаблон моста-Википедия, свободная энциклопедия[^]

Таким образом, вы создаете мост, который позволит вам имитировать управляемый класс C#, производный от неуправляемого класса C++. Конечно, вы не можете сделать это напрямую. Но нетрудно создать управляемый интерфейс в C++/CLI, который имитирует ваш исходный интерфейс, а затем иметь также класс, производный от вашего исходного интерфейса, и перенаправлять все вызовы на управляемый интерфейс.

Поскольку для этого требовалось несколько строк кода, я не буду его писать. Если вы знаете, как хранить управляемые данные внутри собственного класса, то его реализация должна быть относительно тривиальной.

С другой стороны, действительно ли вам нужно реализовать собственный абстрактный класс C++ с помощью управляемого класса C#? На самом деле смешивание управляемого и машинного кода действительно требует некоторых знаний о взаимодействии.

Кстати такая книга может быть очень полезна если вы действительно хотите написать такой код: Manning | C++/CLI в действии[^]

P.S. см. также мои комментарии под вопросом и второе решение.


Рейтинг:
0

Leo Chapiro

Взгляните на этот пример: Как создать dll в C++ для использования в C# - Stack Overflow[^]

Код C++ (DLL), например. math.cpp, скомпилированный в HighSpeedMath.dll:

extern "C"
{
    __declspec(dllexport) int __stdcall math_add(int a, int b)
    {
        return a + b;
    }
}

Код C#, например. Программа. cs:

namespace HighSpeedMathTest
{
    using System.Runtime.InteropServices;

    class Program
    {
        [DllImport("HighSpeedMath.dll", EntryPoint="math_add", CallingConvention=CallingConvention.StdCall)]
        static extern int Add(int a, int b);

        static void Main(string[] args)
        {
            int result = Add(27, 28);
        }
    }
}


lorenzo todeschi

это не решение моей проблемы, потому что. testfunction-это интерфейс, так как же я могу расширить класс C# с помощью интерфейса C++?

Philippe Mori

Вы не можете сделать это напрямую, так как ваш класс C++ не управляется. Смотрите мое решение.