The simplest way is an anonymous method passed into Label.Invoke:
// Running on the worker thread
string newText = "abc";
// Running on the UI thread
form.Label.Text = newText;
// Back on the worker thread
Notice that Invoke blocks execution until it completes--this is synchronous code. The question doesn't ask about asynchronous code, but there is lots of content on Stack Overflow about writing asynchronous code when you want to learn about it.
1As per Mr.Mindor's comment: System.Reflection.Assembly.GetExecutingAssembly().Location returns where the executing assembly is currently located, which may or may not be where the assembly is located when not executing. In the case of shadow copying assemblies, you will get a path in a temp directory. System.Reflection.Assembly.GetExecutingAssembly().CodeBase will return the 'permanent' path of the assembly.