prawdopodobnie najlepszym sposobem, aby przejść tutaj jest wykorzystanie P/Invoke lub Platform Invoke. W zależności od struktury lub interfejsu C++ dll możesz zawinąć go w czysty interfejs C; jest najłatwiejszy, jeśli twój interfejs używa tylko typów blittable. Jeśli ograniczysz interfejs dll do typów blittable (Int32, Single, Boolean, Int32 [], Single [], Double [] - podstawy) nie będziesz musiał wykonywać żadnych złożonych połączeń danych między zarządzanym (C#) i niezarządzanych (C) pamięci.
Na przykład w kodzie C# definiujesz dostępne połączenia w bibliotece dll C/C++ za pomocą atrybutu DllImport.
[DllImport, "ExactDllName.dll"]
static extern boolean OneOfMyCoolCRoutines([In] Double[] x, [In] Double[] y, [Out] Double result)
Małych [In] i [Out] nie są ściśle wymagane, ale mogą przyspieszyć rzeczy. Teraz dodając "ExactDllName.dll" jako odniesienie do projektu C#, możesz wywołać swoją funkcję C/C++ z kodu C#.
fixed(Double *x = &x[0], *y = &y[0])
{
Boolean returnValue = OneOfMyCoolCRoutines(x, y, r);
}
Zauważ, że zasadniczo przekazuję wskaźniki z powrotem i czwarte pomiędzy moją biblioteką dll i kodem C#. To może spowodować błędy w pamięci, ponieważ lokalizacje tych tablic mogą zostać zmienione przez zbieracz śmieci CLR, ale biblioteka dll C/C++ nic o tym nie wie. Aby się tego zabezpieczyć, po prostu poprawiłem te wskaźniki w moim C#, a teraz nie będą one poruszać się w pamięci, podczas gdy moja biblioteka dll działa na tych tablicach. To jest teraz niebezpieczny kod i będę musiał skompilować mój kod C# z/tą flagą.
Istnieje wiele drobnych szczegółów, które mogą współdziałać z językiem, ale to powinno spowodować, że się toczysz. Trzymanie się bezpaństwowego interfejsu C typów blittable to świetna polityka, jeśli to możliwe. Dzięki temu twój kod interopowy będzie najczystszy.
Powodzenia
Paul
Czy za dodanie interfejsu COM? Ponieważ IMHO, przekazywanie argumentów i danych programu z kontenerami COM może być rozwiązaniem. –