You may enjoy this more general solution which depends on finding the solution *.sln file by scanning all parent directories from current or selected one while covering the case of not finding the solution directory!
public static class VisualStudioProvider
{
    public static DirectoryInfo TryGetSolutionDirectoryInfo(string currentPath = null)
    {
        var directory = new DirectoryInfo(
            currentPath ?? Directory.GetCurrentDirectory());
        while (directory != null && !directory.GetFiles("*.sln").Any())
        {
            directory = directory.Parent;
        }
        return directory;
    }
}
Usage:
// get directory
var directory = VisualStudioProvider.TryGetSolutionDirectoryInfo();
// if directory found
if (directory != null)
{
    Console.WriteLine(directory.FullName);
}
In your case:
// resolve file path
var filePath = Path.Combine(
    VisualStudioProvider.TryGetSolutionDirectoryInfo()
    .Parent.FullName, 
    "filename.ext");
// usage file
StreamReader reader = new StreamReader(filePath);
Enjoy!
Now, a warning.. Your application should be solution-agnostic - unless this is a personal project for some solution processing tool I wouldn't mind. Understand that, your application once distributed to users will reside in a folder without the solution. Now, you can use an "anchor" file. E.g. search parent folders like I did and check for existence of an empty file app.anchor or mySuperSpecificFileNameToRead.ext ;P If you want me to write the method I can - just let me know.
Now, you may really enjoy! :D