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.
var s = new LineSeries(); s.Title = "Nieciągłe przedziały"; s.Points.Add(new DataPoint(2, 1)); s.Points.Add(new DataPoint(3, 1)); s.Points.Add(new DataPoint(4, 1)); s.Points.Add(new DataPoint(6, 1)); s.Points.Add(new DataPoint(8, 1)); s.Points.Add(new DataPoint(10, 1));To jednak nie zadziała gdyż w rezultacie otrzymamy linię ciągłą, czego zresztą należało się spodziewać ponieważ LineSeries po prostu łączy kolejne punkty. Wypróbowałem więc inne rodzaje wykresów, bawiłem się ustawieniami, ale bez rezultatów. Rozwiązanie okazało się jednak bardzo proste. Jeśli nie chcemy, aby dwa punkty zostały połączone linią to pomiędzy nimi należy umieścić punkt o współrzędnych (Double.Nan, Double.NaN).
var s = new LineSeries(); s.Title = "Nieciągłe przedziały"; s.Points.Add(new DataPoint(2, 1)); s.Points.Add(new DataPoint(3, 1)); s.Points.Add(new DataPoint(Double.NaN, Double.NaN)); s.Points.Add(new DataPoint(4, 1)); s.Points.Add(new DataPoint(6, 1)); s.Points.Add(new DataPoint(Double.NaN, Double.NaN)); s.Points.Add(new DataPoint(8, 1)); s.Points.Add(new DataPoint(10, 1));Na koniec jeszcze przykład tak skonstruowanego wykresu: