Serdecznie Pozdrawiam,
Michał Komorowski
The blog about programming, working in IT and not only
\Tree[.{L0 - Root} [.{L1 - Left child} [.{L2 - Left child} ] [.{L2 - Right child} ]] [.{L1 - Right child} ]]Efekt końcowy wygląda natomiast następująco:
public interface ITest { int Value { get; set; } void Start(); } public class MarshalByRefObjectClass : MarshalByRefObject, ITest { public int Value { get; set; } public void Start() { Console.WriteLine(AppDomain.CurrentDomain.FriendlyName); Value++; } } [Serializable] public class MarshalByValueClass : ITest { public int Value { get; set; } public void Start() { Console.WriteLine(AppDomain.CurrentDomain.FriendlyName); Value++; } }Mamy również następujący kod, w którym testuję jak zachowuja się:
private static void Test(AppDomain app, ITest test, bool doCallBack) { if (doCallBack) app.DoCallBack(test.Start); else test.Start(); Console.WriteLine(test.Value); }A to właściwy test, w którym najpierw tworzę obiekty przekazywane przez wartość/referencję lokalnie i w nowej domenie. Następnie wywołuję dla nich metodę Start i odczytuję właściwość Value.
var app = AppDomain.CreateDomain("TestDomain"); var asm = Assembly.GetExecutingAssembly(); var byRef = new MarshalByRefObjectClass(); var byRef1 = new MarshalByRefObjectClass(); var byRef2 = (MarshalByRefObjectClass)app.CreateInstanceFromAndUnwrap(asm.CodeBase, typeof(MarshalByRefObjectClass).FullName); var byRef3 = (MarshalByRefObjectClass)app.CreateInstanceFromAndUnwrap(asm.CodeBase, typeof(MarshalByRefObjectClass).FullName); var byValue = new MarshalByValueClass(); var byValue1 = new MarshalByValueClass(); var byValue2 = (MarshalByValueClass)app.CreateInstanceFromAndUnwrap(asm.CodeBase, typeof(MarshalByValueClass).FullName); var byValue3 = (MarshalByValueClass)app.CreateInstanceFromAndUnwrap(asm.CodeBase, typeof(MarshalByValueClass).FullName); Test(app, byRef, true); Test(app, byRef1, false); Test(app, byRef2, true); Test(app, byRef3, false); Test(app, byValue, true); Test(app, byValue1, false); Test(app, byValue2, true); Test(app, byValue3, false);Pytanie brzmi co zostanie wypisane na ekranie? Pokaż/Ukryj odpowiedź
Sandbox.vshost.exe 1 Sandbox.vshost.exe 1 TestDomain 1 TestDomain 1 TestDomain 0 Sandbox.vshost.exe 1 TestDomain 0 Sandbox.vshost.exe 1
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\Shell\COMMAND_NAME] [HKEY_CLASSES_ROOT\*\Shell\COMMAND_NAME\command] @="COMMAND"Jeśli polecenie ma być dostępne dla określonych plików
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.EXTENSION\Shell\COMMAND_NAME] [HKEY_CLASSES_ROOT\.EXTENSION\Shell\COMMAND_NAME\command] @="COMMAND"Jeśli polecenie ma być dostępne dla katalogów
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Directory\Shell\COMMAND_NAME] [HKEY_CLASSES_ROOT\Directory\Shell\COMMAND_NAME\command] @="COMMAND" [HKEY_CLASSES_ROOT\Directory\Background\Shell\COMMAND_NAME] [HKEY_CLASSES_ROOT\Directory\Background\Shell\COMMAND_NAME\command] @="COMMAND"W powyższych wzorcach COMMAND_NAME oznacza nazwę opcji jaka pojawi się w menu kontekstowym np.: Shred, EXTENSION to rozszerzenie pliku np.: txt i w końcu COMMAND to skrypt/polecenie jakie ma zostać wykonane po wybraniu przez użytkownika określonej opcji z menu kontekstowego np.: T:\\bin\\shred -n 10 -v -z \"%1\". Zwróćcie uwagę, że przy podawaniu ścieżki stosuję podwójny ukośnik tj. \\ oraz, że cudzysłów wewnątrz polecenia jest poprzedzony ukośnikiem tj. \". Na koniec uzupełnione wzorce należy zapisać w pliku z rozszerzeniem *.reg i przez podwójne kliknięcie na takim pliku dodać go do rejestru. Zmiany będą widoczne natychmiast.