Korzystanie z klasy C++ DLL w aplikacji C#

Mam niezarządzaną bibliotekę C++, która eksportuje tylko jedną klasę (nie COM...it ' s just a simple C++ class) jako jego interfejs. Chcę używać tej klasy w C#, ale powiedziano mi, że nie może być ona jedynie importowana do C#.

Jaki jest właściwy sposób użycia tej klasy w mojej aplikacji C#?

Author: Bill the Lizard, 2009-02-20

5 answers

Prosty sposób zakładania klasy Foo:

  1. Utwórz projekt C++ / CLI, nazwij go FooWrapper.
  2. spraw, aby FooWrapper był zależny od niezarządzanej biblioteki dll(jak zwykle).
  3. Utwórz klasę zarządzaną ManagedFoo, która zawiera pojedyncze prywatne pole instancji typu Foo*.
  4. zapewnia publiczne funkcje owijania w ManagedFoo, które są przekazywane do podstawowego pola wystąpienia.
  5. opcjonalnie (choć zalecane):
    • Konwertuj parametry z idiomów. NET (strings and the like) to C++ idioms (std::string or char*)
    • łap niezarządzane wyjątki i wyrzuć zarządzane wyjątki

Następnie upewnij się, że Twój kod c# zależy od projektu FooWrapper / dll i upewnij się, że niezarządzana dll jest prawidłowo wdrożony z nim, jak to jest zrobione zależy od niezarządzanej dll ale w tym samym katalogu jest zwykle wystarczające.

Jeśli funkcje nie opierają się na instancjach klasy, to jeszcze prostsze jest P / Invoke

 43
Author: ShuggyCoUk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-31 11:37:59

Ta odpowiedź może być przesadą dla pojedynczej biblioteki klas, ale SWIG jest dobrym rozwiązaniem do "owijania" klas C / C++ do użytku z innych języków. Działa dobrze z C#.

Zobacz też http://www.swig.org/.

 8
Author: Stewart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-20 14:24:35

DllImport jest najlepszym rozwiązaniem. Jest trochę masowania typu danych, zwłaszcza jeśli przekazujesz struktury, ale możesz z nim zrobić prawie wszystko.

 3
Author: Steve,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-20 15:18:24

Potrzebujesz pośrednika proxy (GOF pattern), aby pomostować zarządzaną / niezarządzaną granicę.

Dwie opcje:

  • A C++/CLI wrapper
  • owijarka COM.

Pierwszy będzie bardziej bezpośredni, a drugi ma dwa kroki czysty C++ - > COM ->. NET.

 2
Author: Richard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-20 13:55:12

Czasami łatwiej jest zapewnić własny interfejs C. SWIG jest nietrywialny w konfiguracji. Używam managed C++ i C++ / CLI i są w porządku. Najłatwiej było po prostu zrobić wrapper C (i może być używany przez mniej więcej każdy inny język, ponieważ większość ma sposób na wywołanie funkcji C).

 2
Author: chrish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-20 21:01:22