Czy mogę użyć a.NET 4.0 Biblioteka w a.NET 2.0 aplikacja?

Mam problemy z używaniem bibliotek. NET 4.0 w aplikacjach. NET 2.0. Myślę, że byłem pod wrażeniem, że będąc DLL systemu Windows, moje inne aplikacje. NET będzie w stanie uzyskać dostęp do niego. Czy tak nie jest? Jakieś zalecenia dotyczące obsługi aplikacji w obu środowiskach?

EDIT : zdaję sobie sprawę, że muszę zainstalować Framework. NET 4.0 na docelowym systemie, czy są inne powody, dla których to nie będzie / nie powinno działać?

Edytuj : Prawdopodobnie powinno być bardziej szczegółowe. Mamy aktualną, dużą / złożoną aplikację napisaną w. NET 2.0 (ASP.NET być dokładnym). Mamy nowy zestaw narzędzi integracyjnych i elementów przepływu pracy, które piszemy w. NET 4.0. Chcieliśmy dodać jedną z bibliotek utworzonych w wersji 4.0 do projektu. NET 2.0 (obecnie w wersji VS2008) i skorzystać z kilku jego metod. Kiedy to robimy, napotykamy na problemy, często tajemnicze błędy związane z pamięcią.

Wygląda na to, że zarówno Earwicker, jak i Brian Rasmussen w końcu są poprawne. Ponieważ nie jestem zbyt chętny na ujawnianie rzeczy za pośrednictwem COM (Nie wiem, czy jest to technicznie COM, czy nie, ale niezależnie) myślę, że będę trzymać się idei, że dwa nie są "kompatybilne" i patrzeć na inne środki, które myślę, że mamy na podstawie naszych konkretnych potrzeb. W dłuższej perspektywie będziemy dążyć do przeniesienia kodu. NET 2.0 do 4.0.

Author: Douglas Anderson, 2010-03-05

7 answers

Tak, to jest całkowicie możliwe. Po prostu wystawiasz komponenty zapisane w 4.0 jako obiekty COM. Aplikacja hostingowa 2.0 używa ich tylko jako obiektów COM i nie ma pojęcia, czy są natywne, 2.0, 4.0 czy cokolwiek innego. COM jest wspólnym interfejsem, który obie wersje runtime muszą zaimplementować identycznie.

Nowa obsługa SxS w 4.0 oznacza, że gdy obiekt COM oparty na 4.0 jest załadowany, pobiera wymagany czas pracy zamiast próbować uruchomić na 2.0, więc oba środowiska uruchomieniowe są obecne w procesie zarządzania własnymi obiektami. Chociaż nie można bezpośrednio przekazać obiektów CLR między nimi, można przekazać interfejsy COM, a CLR przejrzyście zawija obiekty w interfejsy COM dla Ciebie.

Nie wiem, czy można zrobić pojedynczy montaż interop dla obu wersji do pracy z. Ale widać, że w C# w 2.0 można napisać interop assembly, wyeksportować go do a .tlb, a następnie zaimportować go do montażu w 4.0. Daje to dwa pasujące do siebie interpunkcje opisujące identyczne interfejsy COM. (Lub po prostu zbudować to samo źródło C# w projekcie assembly każdej wersji).

Bonus Update: czy otrzymana aplikacja będzie oparta na COM (z wszelkimi problemami, które pociągają za sobą)?

To zależy jak na to spojrzysz. Autorzy komponentów będą tworzyć je jako komponenty COM. Więc aplikacja hosta musi zlokalizować i załadować je jako komponenty COM. Oznacza to wygłupianie się z manifestami GAC, registry lub SxS, które są o wiele mniej czyste niż tylko nakazanie autorom komponentów upuszczenia ich złożenia do określonego katalogu, aby można było załadować je z odbiciem.

I ma to wpływ w czasie wykonywania: gdy host ma odniesienie do komponentu, nie będzie jednego, ale trzy obiekty. Host ma odniesienie do RCW, który ma wskaźnik do interfejsu COM zaimplementowanego przez CCW, który z kolei posiada odniesienie do rzeczywistego komponentu. CCW w środku jest obiektem com zliczonym przez odniesienia, a RCW hosta ma finalizer, który wywołuje Release Na CCW, a po jego zniszczeniu dealokuje GCRoot, który utrzymuje przy życiu rzeczywisty komponent.

Oznacza to, że-z wystarczająco skomplikowanym układem wskaźników zwrotnych itp. - system może skończyć się kolistymi problemami z liczeniem odniesień, w których odłączona "Wyspa" obiektów trzyma odniesienia do siebie i nigdy nie zostaje dealokowana.

 23
Author: Daniel Earwicker,
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
2010-03-08 16:38:34

Należy pamiętać, że wersja 4.0 to więcej niż tylko dodatkowe zespoły. Sam runtime również został zmieniony w tej wersji (nowy współbieżny tryb GC, wiele zmian w puli wątków, mscorwks.dll nazywa się teraz clr.dll, itp.).

 10
Author: Brian Rasmussen,
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
2010-03-04 21:55:49
 10
Author: arik,
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
2013-12-11 21:17:45

Może to być możliwe w zależności od tego, jak go używasz. W. Net 4.0 masz możliwość wykonania w procesie obok siebie (InProc SxS). Pozwala to na hostowanie dwóch różnych wersji CLR w tej samej przestrzeni procesowej. To jest wyjaśnione tutaj.

Czy możesz skorzystać z tego w swoim situtaion Nie wiem. Nie mam bezpośredniego doświadczenia, by Ci pomóc.

Niektóre scenariusze , w których można to wykorzystać.

 3
Author: softveda,
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
2010-03-04 22:01:14

Wygląda na to, że wbudowana funkcja side-by-side, która została dodana do CLR 4, nie pomoże w tym przypadku, ponieważ chce używać biblioteki .NET4.0 w aplikacji.NET2.0. O ile to Rozumiem, in-process SxS byłby pomocny, gdyby sprawa była odwrotna (zużywanie .NET2.0 w aplikacji .NEt4.0), ponieważ CLR z 4.0 będzie działać obok 2.0 w tym samym procesie..

 1
Author: Derar,
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
2010-03-04 23:34:56

Twój zestaw skompilowany dla. Net 4 będzie zawierał odniesienia do innych bibliotek. NET 4 framework, które nie są obecne w.NET 2.0.

Jeśli chcesz, aby Twoje aplikacje były kompatybilne z. NET 2.0, możesz użyć Visual Studio 2005 lub target twoje projekty do. NET 2.0, Jeśli używasz Visual Studio 2008 lub 2010. Oczywiście, jeśli kierujesz swoje projekty do. NET 2.0, nie będziesz mógł korzystać z funkcji. NET 3.5/4.

 0
Author: Daniel Melo,
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
2010-03-04 21:55:24

Miałem podobny problem z moją aplikacją, w której nie byłem w stanie odwołać się do API, które używało komponentów.NET 4.0.
Aby rozwiązać ten problem, utworzyłem nową bibliotekę klas, która odnosiła się do mojego projektu. NET 4.0, a następnie nazwałem ten nowy assembly z mojego projektu. NET 2.0. Zmapowałem dane pochodzące z projektu. NET 4.0 do wykorzystania przez mój projekt. NET 2.0.
To rozwiązało mój problem.

 0
Author: savvyBrar,
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
2015-06-17 03:14:17