*This code originally came from another blog, although it was written in VB over there.  It has lost some elegance in the translation, but I needed a very quick solution this afternoon, and I needed it in C#, so here you go.  *
I needed to determine whether several assemblies were built as “Debug” or “Release” code this afternoon.  They didn’t have any debug symbols with them, so that was no help.  A bit of searching led me to the code below.
private void testfile(string file)
{
	if(isAssemblyDebugBuild(file))
	{
		MessageBox.Show(String.Format("{0} seems to be a debug build",file));
	}
	else
	{
		MessageBox.Show(String.Format("{0} seems to be a release build",file));
	}
}
private bool isAssemblyDebugBuild(string filename)
{
	return isAssemblyDebugBuild(System.Reflection.Assembly.LoadFile(filename));
}
private bool isAssemblyDebugBuild(System.Reflection.Assembly assemb)
{
	bool retVal = false;
	foreach(object att in assemb.GetCustomAttributes(false))
	{
		if(att.GetType() == System.Type.GetType("System.Diagnostics.DebuggableAttribute"))
		{
			retVal = ((System.Diagnostics.DebuggableAttribute)att).IsJITTrackingEnabled;
		}
	}
	return retVal;
}
The overloaded “isAssemblyDebugBuild” method will accept either a string containing the fiull filename, or a System.Reflection.Assembly object.  It will return its best guess as to whether the the assembly is a debug build, as a boolean.
To call the methods as they are (to get a MessageBox), just use something like
testfile(@"C:\myUnknownAssembly.dll");
or access the underlying methods directly :
bool isDebug = isAssemblyDebugBuild(@"C:\myUnkownAssembly.dll");
I hope someone can use this to save themselves some time.