perlon

[C#] Niezgodność wersji PL i EN

Recommended Posts

Dzień dobry.

Nie bardzo wiedziałem gdzie to umieścić więc trafia do wsparcia programistycznego. Popełniłem kawałek aplikacji, w której wykorzystuję kontener wstrzykiwania zależności Autofac. Powiedzmy, że aplikacja już działa, więc postanowiłem ją dać kolegom w biurze do testowania. No i spotkał mnie taki zonk:

wersja ZwCAD 2020 SP2 PL i komunikat :

An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = ElevationMarksPresenter (ReflectionActivator), Services = [CADKit.Contracts.IPresenter, CADKitElevationMarks.Contracts.Presenters.IElevationMarksPresenter], Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime, Sharing = Shared, Ownership = OwnedByLifetimeScope ---> An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = MarkService (ReflectionActivator), Services = [CADKitElevationMarks.Contract.Services.IMarkService], Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime, Sharing = Shared, Ownership = OwnedByLifetimeScope ---> An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = MarkIconService (ReflectionActivator), Services = [CADKitElevationMarks.Contracts.Services.IMarkIconService], Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime, Sharing = Shared, Ownership = OwnedByLifetimeScope ---> An exception was thrown while invoking the constructor 'Void .ctor()' on type 'MarkIconService'. ---> Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu. (See inner exception for details.) (See inner exception for details.) (See inner exception for details.) (See inner exception for details.)

Ewidentnie kontener nie poradził sobie z rejestracją typów choć dziwne jest to że część typów załadował i obsługuje a część tych ładowanych z jednej tylko DLL'ki już nie. Po kilku testach na czystej maszynie wirtualnej z Windows 7 zainstalowałem równolegle z PL wersję EN. Na swoim kompie używam wyłącznie wersji EN. No i o dziwo poszło zarówno na EN jak i na PL. Jest dobrze. Więc odinstalowałem wersję EN no i niestety komunikat powrócił 😞. Jest coś w wersji EN czego brakuje w wersji PL co powoduje, że moja nakładka się buntuje. Może ktoś pomóc w temacie?

Załączam na razie same skompilowane biblioteki DLL. W najbliższym czasie w osobnym wątku skrobnę parę słów na temat i załączę kompletne kody, ale tak na szybko chciałem wrzucić problem który mnie dotknął i nie jest on związany ściśle z kodem aplikacji w C# pod ZwCAD'a. 

Jeszcze zrzuty które pokazują że jest coś nie tak:

1853660442_2020-02-1314_59_47-ZWCAD2020ProfessionalEdition-Drawing1_dwg.thumb.png.f724dcb105ed062095ee4dd4fd6cf2ec.png

1675110388_2020-02-1314_58_38-UIMachineViewNormalClassWindow.thumb.png.b20797b87faac579862435804327c0e4.png

 

Autofac.dll

CADKitBasicZwCAD.dll

CADKitElevationMarksZwCAD.dll

CADKitZwCAD.dll

Share this post


Link to post
Share on other sites

Proszę napisać coś więcej w temacie jak się tym posługiwać.

Odblokowałem pliki dll zgodnie z powyższym filmikiem, wcześniej wywalało mi że load failed.
Teraz kiedy ładuję plik CADKitBasicZwCAD przez polecenie NETLOAD
Wyświetala mi:
Ładowanie CADKitBasicZwCAD...
Ładowanie CADKitElevationMarksZwCAD...
I co dalej? jest OK bo nie ma wspomnianego przez Pana komunikatu błędu? czy nie jest OK bo nie widzę panela widocznego na Pana screenie?

Wczytuję też CADKitZwCAD.dll i Autofac.dll nic się nie dzieje, nie wyświetla ani błąd, ani potwierdzenie że coś jest OK.

 

Share this post


Link to post
Share on other sites

 

Fakt. Zapomniałem dołączyć loadera lispowego. Jest w załączeniu. Podstawową biblioteką jest CADKitZwCAD.dll. W niej jest "autostart" który ładuje pozostałe biblioteki, które są w tej samej lokalizacji i zaczynają się od CADKit... 

(vl-load-com)
(cond
	((= (getvar "PRODUCT") "ZWCAD") (vl-cmdf "netload" "CADKitZwCAD.dll"))
	((= (getvar "PRODUCT") "AutoCAD") (vl-cmdf "netload" "CADKitAutoCAD.dll"))
	(T (progn
			(princ "\nNieznana platforma CAD. CADKit nie może być wczytany.")
		)
	)
)

(princ)

Z grubsza funkcjonalność pokazana jest na filmie. Tak na marginesie. Gdzieś jest instrukcja jak wstawić do posta film z youtuba?

https://youtu.be/Pwgb96g_7Oc

 

 

Share this post


Link to post
Share on other sites

Co do samej nakładki ja to nazwałem na własny użytek jako wprawki w szarpowaniu CAD'a. Każdy, kto coś niecoś kodził czy to w LISP'ie czy VBA czy C# napisał kody do wstawiania jakichś obiektów. Parafrazując starą reklamę : "Wszyscy mają koty wysokościowe, mam i ja". Nie jest to żaden wyczyn ani nie jest to odkrywcze. Raczej powód do ćwiczeń i okazja do zastosowania kilku wzorców projektowych ogólnego przeznaczenia jak factory pattern, dependence injection, klas abstrakcyjnych etc. Przy okazji starałem się rozwiązać temat zmiany schematu kolorów interfejsu ciemny/jasny czy synchronizacji CANONSCALE. Jest też zawarta propozycja automatycznego ładowania kolejnych modułów jeżeli tylko istnieją i spełniają odpowiednie warunki oraz uruchomienie jednego okna PALETTESET z dynamicznie dodawanymi zakładkami reprezentującymi kolejne biblioteki z ich funkcjonalnościami. Dodatkowo jeszcze samo okno jest budowane za pomocą wzorca MVP (Model-View-Presenter). To co jest w tej chwili nie ma zbyt wiele użytecznej funkcjonalności, ale posiada infrastrukturę do łatwego rozbudowania. Przykładowo żeby dołożyć dodatkowe koty wysokościowe wystarczy tylko zdefiniować jedną klasę dziedziczącą po klasie Mark, dodać ją do serwisu MarkServis i jest dodatkowy przycisk w oknie. Można to sobie obejrzeć w kodzie zapraszam na GITHuba. Jeżeli jest ktoś zainteresowany takimi ćwiczeniami z szarpowania a przy okazji chciałby tworzyć jakąś funkcjonalność w ramach Open Source to zapraszam do grona "developerów" 😎

Acha. Jeszcze dodam, że podjąłem (jak na razie nieudaną) próbę stworzenia biblikoteki/klasy Proxy na różne platformy CAD która by przesłoniła te platformy uniezależniając samą nakładkę od tego gdzie jest uruchamiana. Chodzi o to żeby była jedna biblioteka CADKitZwCAD.dll z odwołaniem do ZwDatabaseMgd.dll, ZwManaged.dll, a pozostałe moduły odwoływały by się poprzez Proxy do mechanizmów ZwCAD'a. Na chwilę obecną działa to na zasadzie kompilacji warunkowej na podstawie zdefiniowanego symbolu "preprocesora".

 

Edited by perlon

Share this post


Link to post
Share on other sites

Jeszcze uwaga dotycząca procesu kompilacji. Ponieważ projekt CADKit jest niezależny od CADKitBasic i CADKitElevationMarks choć jest główną biblioteką która ma wczytywać pozostałe nie może być projektem głównym. Tzn może być ale jego kompilacja nie spowoduje kompilacji dwóch pozostały bibliotek. Więc ich nie będzie i przy starcie nie zostaną załadowane. Żeby to obejść dopisałem w post-buildzie pozostałych projektów : copy $(TargetPath) $(SolutionDir)\CADKit\bin\$(ConfigurationName) co każdorazowo po kompilacji projektu skopiuje dll'kę do katalogu CADKit/bin/$(ConfigurationName). No ale F5 wywołuje kompilację głównego projektu i tylko jego zależności. Tak więc wymagany jest F6 (Build solution) a potem F5 (Start debugging). Obejściem problemu może być uczynienie głównym projektem testów jednostkowych. Jest to projekt do którego są podpięte jako zależności wszystkie pozostałe projekty i jego kompilacja wywoła kompilację wszystkich pozostałych a więc skopiowanie gotowych dll do katalogu CADKit/bin/$(ConfigurationName). Pozostaje tylko odpalić F5 ustawić Start external program. (Chyba to powinienem opisać w Readme na GITHubie :blush:). Tak na marginesie testy jednostkowe też leżą i kwiczą.

Jak widać projekt ma jeszcze mnóstwo mankamentów, niedoróbek i wymaga licznych refaktoryzacji. Jeżeli dojrzeje być może znajdzie swoje miejsce w dziale" Nakładki na ZWCAD i ZWCAD+". Dlatego wszelka pomoc jest bardzo mile widziana z zastrzeżeniem że zawsze to będzie Open Source.

Edited by perlon

Share this post


Link to post
Share on other sites

Wracając do tematu wątku. Środowisko : maszyna wirtualna z Windows7 64bit i zainstalowanym ZwCAD2020SP1 PL 64bit. Przeprowadziłem następującą sekwencję działań: 

1. Uruchomienie wersji PL. Autofac zgłasza brak zarejestrowanych typów. Nakładka nie działa prawidłowo.

2. Instalacja ZwCAD2020SP1 EN bez uruchomienia po instalacji. Uruchomienie wersji PL. Autofac wywala błąd. 

3. Uruchomienie wersji EN a następnie jej zamknięcie. Uruchomienie wersji PL. Nakładka uruchamia się prawidłowo

UWAGA. Instalacja wersji EN po wersji PL jest tak naprawdę instalacją Language Pack'a EN Przynajmniej tak to wygląda na liście zainstalowanych programów.

4. Restart maszyny wirtualnej. Uruchomienie wersji PL. Nakładka działa prawidłowo.

5. Odinstalowanie wersji EN z usunięciem user data. Uruchomienie wersji PL. Autofac wywala błąd.

6. Instalacja wersji EN bez uruchomienia po instalacji. Uruchomienie wersji PL. Autofac wywala błąd.

7. Uruchomienie i wyłączenie wersji EN. Uruchomienie wersji PL. Nakładka działa prawidłowo.

8. Odinstalowanie wersji EN z zachowaniem user data. Uruchomienie wersji PL. Autofac wywala błąd.

Wnioski.

Do prawidłowego działania nakładki (Autofac'a) wymagane jest zainstalowanie wersji EN i jednokrotne jej uruchomienie. Po tej operacji również po restarcie maszyny nakładka na wersji PL uruchamia się prawidłowo aż do czasu odinstalowania wersji EN. Zachowanie lub nie user data nie ma w tym przypadku znaczenia. Coś z tym można zrobić?

Share this post


Link to post
Share on other sites

Niepotrzebnie w przypadku ESC rzucałem wyjątkiem który nie przechodził przez Resolve() z kontenera DI. Brak punkty koty przekazałem przez property i teraz jest już OK. Poprawka już zpushowana.

25 minut temu, Parikon napisał:

U mnie na wersji PL vernum = "2020.01.07(53615)_x64" Windows 10 czerwono w palecie jak w pierwszym poście.

No dopóki czegoś w ZWSOFT'cie nie poprawią to bez language packa EN działać nie będzie 😞

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now