Aplikacja C# jako biblioteka.

0

Hej,

mam napisaną aplikację w C# (kilkanaście klas) a teraz zaistniała potrzeba ażeby z innej aplikacji C# wywoływać pewne metody (podpięte do menu w interfejsie użytkownika).
Wyciągnięcie tego do osobnej biblioteki jest nieco kłopotliwe i szukam sposobu na obejście takiego rozwiązania.
Są jakieś alternatywy?

Pozdrawiam.

0

Cześć @EG! Fajnie że założyłeś konto na forum! 🥳

EG napisał(a):

mam napisaną aplikację w C# (kilkanaście klas) a teraz zaistniała potrzeba ażeby z innej aplikacji C# wywoływać pewne metody (podpięte do menu w interfejsie użytkownika).
Wyciągnięcie tego do osobnej biblioteki jest nieco kłopotliwe i szukam sposobu na obejście takiego rozwiązania.
Są jakieś alternatywy?

A mógłbyś opisać co dokładnie próbujesz zrobić? Czemu ta druga aplikacja musi się dostać do pierwszej?

0
Riddle napisał(a):

A mógłbyś opisać co dokładnie próbujesz zrobić? Czemu ta druga aplikacja musi się dostać do pierwszej?

Są dwie aplikacje.
Starsza wersja ma pewną funkcjonalność, której nie ma nowsza.
No i chodzi o to ażeby z tej nowszej uruchomić to czego ona nie posiada.

0

Możesz to zrobić prosto przez mutex albo jakieś api po tcp

0

To są apki dekstopowe czy web?

1
EG napisał(a):

Starsza wersja ma pewną funkcjonalność, której nie ma nowsza.
No i chodzi o to ażeby z tej nowszej uruchomić to czego ona nie posiada.

Czy najprościej nie byłoby po prostu skopiować kod starej do nowej? 🤔 jeśli starsza nie jest już za bardzo rozwijana, to to nie powinien być problem.

Wtedy skopiowany kod mógłbyś użyć, i po pewnym czasie usprawniać i dostosować do nowej klasy. Jeśli tylko zrobisz referencję to "stary" kod pozostanie stary.

0

Najmniej inwazyjnym sposobem jest mechanizm refleksji. Tworzysz obiekt Assembly i do niego, za pomocą Load wczytujesz plik *.dll lub *.exe, może być nim ta stara aplikacja w C#. W takim assembly potem tworzysz obiekt za pomocą CreateInstance, a metody wywołujesz na pobraniu typu poprzez GetType, za pomocą InvokeMember. W ten sposób można uruchamiać metody, zapisywać pola i odczytywać pola.

Opis tych metod:
https://learn.microsoft.com/en-us/dotnet/api/system.reflection.assembly.load?view=net-8.0
https://learn.microsoft.com/en-us/dotnet/api/system.reflection.assembly.createinstance?view=net-8.0
https://learn.microsoft.com/en-us/dotnet/api/system.type.gettype?view=net-8.0
https://learn.microsoft.com/en-us/dotnet/api/system.type.invokemember?view=net-8.0

Jeżeli ilość informacji wymienianych między dwoma aplikacjami nie jest duża, to jest jeszcze inny sposób: W starej aplikacji należy dorobić uruchomienie dodatkowego wątku, który pracuje w nieskończonej pętli, a w niej będzie Console.ReadLine, która przyjmuje polecenie od nowej aplikacji, a potem, wywołuje Console.WriteLine, która oddaje odpowiedź do nowej aplikacji. Nie wiem, jaką masz tą starą aplikację, ale z doświadczenia wiem, że w przypadku aplikacji konsolowej i WinForms takie coś jest możliwe. Następnie, w nowej aplikacji uruchamiassz tą starą poprzez utworzenie obiektu ProcessStartinfo i Process. Pozostaje wymyślić jakiś protokół komunikacji taki, że żądanie i odpowiedź to będzie jedna linia tekstu. Nowa aplikacja uruchomi starą poprzez proces i stara będzie czekać na Console.ReadLine. Nowa wyśle jakiś tekst do standardowego wejścia i będzie czekać na linię tekstu na standardowym wyjściu starej. Wtedy stara aplikacja odczyta ten tekst, wykona czynność i wypisze nowy tekst, dzięki czemu nowa aplikacja otrzyma ten tekst ze standardowego wyjścia starej. O ile z prostymi informacjami, jak np. kilka liczb lub napis składajacy się z samych znaków ASCII nie będzie problemu, o tyle wysłanie bardziej skomplikowanych danych, jak np. tablica będzie nieco problematyczne i przy dużej ilości tych danych ten transport będzie spowalniać współpracę. Można wysłac praktycznie wszystko, ale trzeba zamienić na string zawierający same znaki ASCII, aplikacja po drugiej stronie musi to zinterpretować i dokonać odwrotnej zamiany stosowanie do struktury danych, której się spodziewa w danym przypadku.

https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.processstartinfo.redirectstandardinput?view=net-8.0
https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.processstartinfo.redirectstandardoutput?view=net-8.0
https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.process.start?view=net-8.0

2

We współczesnych wersjach .NET w ogóle można do projektu dodać inny projekt jako referencję i bezpośrednio korzystać z klas innego projektu.

4
EG napisał(a):

Wyciągnięcie tego do osobnej biblioteki jest nieco kłopotliwe i szukam sposobu na obejście takiego rozwiązania.

W 95% przypadków obejścia powodują więcej problemów niż właściwe rozwiązania.

0

ale ze starsza aplikacja napisana w unmanaged code np c a nowsza w managed code c++ - to da sie zrobic te metody mozna bezposrednio wywolac w managed code trzeba zbudowac MOST pomiedzy stara biblioteka a nowa - kiedys to robilem SUPER dziala niestety jakies 9 lat temi i nie mam tego projektu ale 100% sie da zrobic :)

unamanged code mozna wywolac w managed code c#, c++, visual basic,.. chyba o to Ci chodzi :) czasem warto przepisac jesli lifecycle ma byc dlugi danego projektu jak zrobi sie za duzo mostow to jest barwnie w kodzie. .

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.