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#?
5 answers
Prosty sposób zakładania klasy Foo:
- Utwórz projekt C++ / CLI, nazwij go FooWrapper.
- spraw, aby FooWrapper był zależny od niezarządzanej biblioteki dll(jak zwykle).
- Utwórz klasę zarządzaną ManagedFoo, która zawiera pojedyncze prywatne pole instancji typu Foo*.
- zapewnia publiczne funkcje owijania w ManagedFoo, które są przekazywane do podstawowego pola wystąpienia.
- 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
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/.
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.
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.
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).
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