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