Pytanie jest jasno jak zintegrować swój własny kod C++ do jego C# rozwiązania, a nie tylko to, co przypisują do wykorzystania w celu aby wywołać istniejącą funkcję z API win32. Nawet jeśli odpowiedź została już zaakceptowana, myślę, że jest ona niekompletna i powinny obowiązywać następujące zasady.
Tak, to jest powszechną praktyką w przypadku, gdy zadanie może uruchamiać się szybciej, zużywają mniej zasobów, a także w niektórych przypadkach do metod dostępu, które nie są dostępne w .NET Framework.
Jeśli twoim celem jest uzyskanie wydajności trzeba kodować natywną niezarządzanego C++ biblioteki, można utworzyć nowy projekt niekontrolowana C++ (który kompiluje jako biblioteka DLL) w Visual Studio i odniesienia tej biblioteki z projektu C# .
W twoim przypadku wydaje się możesz pisać niezarządzanego biblioteka C++, i stosuje następujące.
Jeśli chodzi o wszelkie bieżące problemy, o które pytałeś o numer, miałoby to wpływ na rozmieszczenie i zaciemnianie.
Wdrożenie: Należy pamiętać, że C# DLL budować będzie działać na każdym procesora, zarówno 32 i 64-bitowe, ale ta nowa rodzimych i niekontrolowana C++ biblioteka będzie zmusić program aby być dla 32 lub 64 konkretne.
To jest coś będzie skonfigurowanie w Visual menedżera konfiguracji Studio i zostaną załatwione w czasie kompilacji czasu, można wybrać AnyCPU dla C# zespołów i dla nowego niezarządzanego C++ biblioteki, która będzie w to jest własny projekt, będziesz mieć do wyboru z win32 lub x64.
Więc teraz masz 2 konfiguracje, to poleca najlepsze praktyki mieć różne konfiguracje, jeden dla 32 i drugi dla 64. A ponieważ 32bit poparcie spada bardzo szybko, można skupić się na 64bit tylko.
Twoja biblioteka może również odnosić się do redystibutu VC++ udostępnianego przez Visual Studio, który być może będziesz musiał dołączyć do swojego wdrożenia, chociaż pewna jego wersja jest zawarta w wielu systemach operacyjnych. Zauważyłem, że rzadko jest to ta sama, którą skompilowałem z i najlepiej jest wdrożyć go z aplikacją, aby mieć pewność. Jeśli tego pakietu nie ma, komputer docelowy będzie miał wyjątek SideBySide w dzienniku zdarzeń-> aplikacja.
Aby uchwycić i obsłużyć wyjątek wyrzucony z kodu niezarządzanego, jedynym haczykiem, który działa, jest ten, który działa bez nawiasu w nawiasie po znaku catch(). Więc możesz zawijać swoje wywołania do kodu niezarządzanego w tym celu, aby obsłużyć wszystkie niezarządzane wyjątki wyrzucone z niezarządzanego kodu, jeśli umieścisz typ .net typu catch (Exception), to przeskoczy go. Jedynym sposobem na złapanie niezarządzanego wyjątku wewnątrz kodu zarządzanego jest ten format.
try
{
//call unmanaged code
}
catch
{
//handle unmanaged exception
}
- zaciemniania: Wszelkie wywołania metod zrobić z C#, które są teraz wywołanie kod niezarządzanej zostanie wykluczony od zmiany nazwy automatycznie. I na odwrotną stronę, jeśli niekontrolowana biblioteki C++ potrzebuje zadzwonić metody z zarządzanych zespołów, te będą musiały być wyłączone z zmiana nazwy, ręcznie, aby być widoczne dla C++ biblioteki wywołującego im.
Jeśli potrzebujesz tylko wywołać dobrze znane biblioteki C++, takie jak Windows, NIE będziesz musiał tworzyć nowego niezarządzanego projektu C++, używaj tylko atrybutu [DllImport()] sugerowanego w poprzedniej odpowiedzi. I w tym przypadku można przyjrzeć się tej publikacji http://www.pinvoke.net/
Czy to reklama dla .NET? A co z kompatybilnością między platformami, problemami z połączeniem, krzywą uczenia się itp.? –
Krzywa uczenia? Przypuszczam, że znasz podstawy zarówno C++, jak i C#, gdy próbujesz łączyć języki. Cross platform? To oczywiste, że pisanie kodu w języku C++ jest o wiele trudniejsze, ale możliwe. Wydaje się jeszcze łatwiejsze w połączeniu z C# - kod wyższego poziomu może decydować, które części C/C++ załadować i użyć na konkretnej platformie. – Harry
@Harry: Przyjmuję twoją odpowiedź, kiedy pokazujesz mi (np.) C# działającego na PIC ;-) –