unsafe public void Load()
		{
			List<NodeInstance> oldInstances = new List<NodeInstance>();
			foreach (var instance in FInstances)
				oldInstances.Add(instance);

			Unload();

			try
			{
				if (!File.Exists(FFilename))
					throw (new Exception("File not found"));

				FTemporaryFilename = System.IO.Path.GetTempPath() + Path.GetFileName(FFilename);
				if (File.Exists(FTemporaryFilename))
				{
					try
					{
						File.Delete(FTemporaryFilename);
					}
					catch
					{
						int index = 0;
						string noExtension = FTemporaryFilename.Substring(0, FTemporaryFilename.Length - 4);

						while (File.Exists(FTemporaryFilename))
						{
							FTemporaryFilename = noExtension + "~" + index.ToString() + ".dll";
							index++;
						}
					}
				}

                WaitForAccess(100);

                File.Copy(FFilename, FTemporaryFilename);
                FWatcher.Path = Path.GetDirectoryName(FFilename);
				FWatcher.EnableRaisingEvents = true;

				FLibrary = LoadLibrary(FTemporaryFilename);
				if (FLibrary == IntPtr.Zero)
					throw (new Exception("Failed to load temporary dll copy at " + FTemporaryFilename + ". Check that you have the openFrameworks dlls in the vvvv.exe folder"));
				SetDataPath = (NodeSetDataPath)Marshal.GetDelegateForFunctionPointer(GetProcAddress(FLibrary, "SetDataPath"), typeof(NodeSetDataPath));
				Create = (NodeCreateDelegate)Marshal.GetDelegateForFunctionPointer(GetProcAddress(FLibrary, "NodeCreate"), typeof(NodeCreateDelegate));
				Destroy = (NodeArgumentlessDelegate)Marshal.GetDelegateForFunctionPointer(GetProcAddress(FLibrary, "NodeDestroy"), typeof(NodeArgumentlessDelegate));
				Setup = (NodeArgumentlessDelegate)Marshal.GetDelegateForFunctionPointer(GetProcAddress(FLibrary, "NodeSetup"), typeof(NodeArgumentlessDelegate));
				Update = (NodeArgumentlessDelegate)Marshal.GetDelegateForFunctionPointer(GetProcAddress(FLibrary, "NodeUpdate"), typeof(NodeArgumentlessDelegate));
				Draw = (NodeArgumentlessDelegate)Marshal.GetDelegateForFunctionPointer(GetProcAddress(FLibrary, "NodeDraw"), typeof(NodeArgumentlessDelegate));
				GetInputCount = (NodeCountPinsDelegate)Marshal.GetDelegateForFunctionPointer(GetProcAddress(FLibrary, "NodeInputCount"), typeof(NodeCountPinsDelegate));
				GetOutputCount = (NodeCountPinsDelegate)Marshal.GetDelegateForFunctionPointer(GetProcAddress(FLibrary, "NodeOutputCount"), typeof(NodeCountPinsDelegate));
				SetInputSliceCount = (NodeSetSpreadSliceCountDelegate)Marshal.GetDelegateForFunctionPointer(GetProcAddress(FLibrary, "NodeSetInputSliceCount"), typeof(NodeSetSpreadSliceCountDelegate));
				GetOutputSliceCount = (NodeGetSpreadSliceCountDelegate)Marshal.GetDelegateForFunctionPointer(GetProcAddress(FLibrary, "NodeGetOutputSliceCount"), typeof(NodeGetSpreadSliceCountDelegate));
				SetInputValue = (NodeSetSpreadValueDelegate)Marshal.GetDelegateForFunctionPointer(GetProcAddress(FLibrary, "NodeSetInputValue"), typeof(NodeSetSpreadValueDelegate));
				GetOutputValue = (NodeGetSpreadValueDelegate)Marshal.GetDelegateForFunctionPointer(GetProcAddress(FLibrary, "NodeGetOutputValue"), typeof(NodeGetSpreadValueDelegate));

				var dataPath = (Path.GetDirectoryName(FFilename) + "\\data").ToCharArray();
				fixed (char* pathAsChar = &dataPath[0])
					SetDataPath(pathAsChar, dataPath.Length);

				this.FLoaded = true;

				foreach (var instance in oldInstances)
				{
					instance.Create();
					instance.Setup();
				}
			}
			catch (Exception e)
			{
				this.FLoaded = false;

				foreach (var instance in FInstances)
					instance.Destroy();

				throw (e);
			}
		}
			unsafe public void Load()
			{
				Unload();

				try
				{
					if (!File.Exists(FFilename))
						throw (new Exception("File not found"));

					FTemporaryFilename = System.IO.Path.GetTempPath() + Path.GetFileName(FFilename);
					if (File.Exists(FTemporaryFilename))
					{
						try
						{
							File.Delete(FTemporaryFilename);
						}
						catch
						{
							int index = 0;
							string noExtension = FTemporaryFilename.Substring(0, FTemporaryFilename.Length - 4);

							while (File.Exists(FTemporaryFilename))
							{
								FTemporaryFilename = noExtension + "~" + index.ToString() + ".dll";
							}
						}
					}

					System.Threading.Thread.Sleep(1000);
					//WaitForAccess(0);

					File.Copy(FFilename, FTemporaryFilename);
					FLastWrite = File.GetLastWriteTime(FFilename);

					FLibrary = LoadLibrary(FTemporaryFilename);
					SetDataPath = (NodeSetDataPath)Marshal.GetDelegateForFunctionPointer(GetProcAddress(FLibrary, "SetDataPath"), typeof(NodeSetDataPath));
					Create = (NodeCreateDelegate)Marshal.GetDelegateForFunctionPointer(GetProcAddress(FLibrary, "NodeCreate"), typeof(NodeCreateDelegate));
					Destroy = (NodeArgumentlessDelegate)Marshal.GetDelegateForFunctionPointer(GetProcAddress(FLibrary, "NodeDestroy"), typeof(NodeArgumentlessDelegate));
					Setup = (NodeArgumentlessDelegate)Marshal.GetDelegateForFunctionPointer(GetProcAddress(FLibrary, "NodeSetup"), typeof(NodeArgumentlessDelegate));
					Update = (NodeArgumentlessDelegate)Marshal.GetDelegateForFunctionPointer(GetProcAddress(FLibrary, "NodeUpdate"), typeof(NodeArgumentlessDelegate));
					Draw = (NodeArgumentlessDelegate)Marshal.GetDelegateForFunctionPointer(GetProcAddress(FLibrary, "NodeDraw"), typeof(NodeArgumentlessDelegate));
					GetInputCount = (NodeCountPinsDelegate)Marshal.GetDelegateForFunctionPointer(GetProcAddress(FLibrary, "NodeInputCount"), typeof(NodeCountPinsDelegate));
					GetOutputCount = (NodeCountPinsDelegate)Marshal.GetDelegateForFunctionPointer(GetProcAddress(FLibrary, "NodeOutputCount"), typeof(NodeCountPinsDelegate));
					SetInputSliceCount = (NodeSetSpreadSliceCountDelegate)Marshal.GetDelegateForFunctionPointer(GetProcAddress(FLibrary, "NodeSetInputSliceCount"), typeof(NodeSetSpreadSliceCountDelegate));
					SetInputValue = (NodeSetSpreadValueDelegate)Marshal.GetDelegateForFunctionPointer(GetProcAddress(FLibrary, "NodeSetInputValue"), typeof(NodeSetSpreadValueDelegate));

					var dataPath = Path.GetDirectoryName(FFilename).ToCharArray();
					fixed (char * pathAsChar = &dataPath[0])
					    SetDataPath(pathAsChar, dataPath.Length);

					this.FLoaded = true;

					foreach (var instance in FInstances)
					{
						instance.Create();
						instance.Setup();
					}
				}
				catch (Exception e)
				{
					this.FLoaded = false;
					throw (e);
				}
			}