It's possible using System.Diagnostics.StackTrace.
For instance, you can get the name of the calling method like so:
private static void stackExample()
{
var stack = new System.Diagnostics.StackTrace(true); // pass true to get more stack info
var callingMethod = stack.GetFrame(1).GetMethod().Name;
var callingLine = stack.GetFrame(1).GetFileLineNumber();
Console.WriteLine("callingMethod: " + callingMethod + " on line " + callingLine.ToString());
}
http://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace.aspx
This will not give you the line of code of the calling method, you'll have to have access to the source code for that. stack.GetFrame(1).GetFileName() will give you the filename of the source code containing the method. What you can do from here, with the Method info and line number is to open the source file and get the line of code in question.
GetMethod() gives you all sorts of great information, like which module the method exists in, then from there you can get the assembly information.
It's actually pretty fun to search through all of the metadata, it tells you all kinds of cool stuff about your code.
The reason you cannot get the actual line of code is the source itself in C# form is not stored in the assembly. While you can get the IL, it's a little more difficult to read. :)