I am for the most part a Windows user. I was kind of moving towards Linux, Ubuntu in particular, but that ship pretty much sailed when I got my hands on Windows 7. Awesome, awesome operating system. But, I still have to use some Unix and Mac systems once in a while. And then there are certain commands that I often use, but always forget since it usually goes a bit of time between times I do it. So, what follows is basically just a list of commands that I keep forgetting, but keep having to look up again.
C#: How to use assembly embedded resources
After some digging around, I found that it actually wasn’t that difficult at all.
Getting it in
Putting something in an assembly as an embedded resource is pretty easy. At least if you are using Visual Studio. Just add the file to your project, click on it, and then under Properties set Build Action to Embedded Resource. And thats it!
Getting it out
Lets say we want an image called hello.png in a folder called Wopdidoo as a Stream.
If we are executing code in the same assembly, we can do as follows:
Stream imageStream = assembly
.GetManifestResourceStream("DefaultNameSpaceOfAssembly.Wopdidoo.hello.png");
If you are not executing code in the same assembly you just have to get that assembly reference in a different way. I often use Assembly.GetAssembly(typeof(T))
, where T is some type you know exists in the same assembly as the file you want. The rest is the same.
As far as I know, you use the stream as any other stream. Not sure if it is writable though? Probably not… let me know if you have some brilliant clues on that matter ๐
รขลกย Remember to Dispose it when you are done.
Finding it
I sometimes find it a bit difficult to figure out that string which identifies the resource. I then often use the following code to “find” it:
System.Diagnostics.Debug.WriteLine(s);
It basically just scans through all the resource names and prints them out to the debug console ๐
C#: Quick way to do cross-thread calls to update form controls
When doing background work you often want to call back to a user interface and let the user know that you are not dead. However, this is can be a bit difficult some times because windows forms can only be updated by code running on the same thread as the forms are. So, to get around this you can for example use a method called Invoke
on the control or form you need to update.
{
// Check if invoke is required
if (InvokeRequired)
{
// And if it is, call Invoke on the form with a delegate to this same method and return.
Invoke(new Action<object, SomeEventArgs>(SomeEventHandler),
new[] { sender, e });
return;
}
// Second time around, InvokeRequired will be false and it will skip
// here where you can update the controls you need to update
}