Hi - in .NET Framework, I need to do something similar to the ShellExecute in the Win32 API. What I need to do is open a file with whatever program its file type is associated with in Windows.

I found the Shell command in .NET but it appears that you have to provide it with the EXE, which is not what I need to do.

I assume there has to be something more elegant in .NET Framework than using the Win32 API ShellExecute.

Any help would be much appreciated.


  • All file associations are stored in the registry - I believe shellexecute is simply looking up these associations and sending the appropriate application a command-line.

    If you don't want to do this I have also just sent the file to "explorer.exe" because explorer.exe will for the most part launch the appropriate association.
  • Good suggestion about using Explorer, thanks!
  • It turns out that using Explorer isn't working so well for users.

    The filetype I'm opening in code is .jpg and on a user's machine it's associated with the Windows Picture and Fax Viewer.

    However the following line of C# code always opens the .jpgs with Internet Explorer, and not the app that .jpg is associated with:

    Interaction.Shell(theExe + " " + imagePath + filName, AppWinStyle.MaximizedFocus, false, -1);

    The variable theExe is a string containing the path to the Windows Explorer executable on that computer. I've got a method that produces that, the core of which is:

    string searchStr;
    foreach (DriveInfo drvInf in DriveInfo.GetDrives())
    //Have to use Fixed drive type to avoid situation in Citrix where
    //we were getting the drives from the computer that logged in
    //to Citrix (in addition to the Citrix machine's drives).
    if (drvInf.DriveType == DriveType.Fixed)
    searchStr = drvInf.Name;
    searchStr = searchStr + @Windowsexplorer.exe;
    FileInfo filInf = new FileInfo(searchStr);
    if (filInf.Exists)
    return searchStr;

    --Any ideas on how I can get it to really use the associated file type?
  • I figured out a much better way to do this without using ShellExecute.

    There's a class called Process under the System.Diagnostics namespace that's very useful. Kind of a strange place to put it since you'd think System.Diagnostics would be all about error handling.

    Anyway, here's an example of how you can use StartInfo and then Start to open a file with whatever application it's type is associated with:

    System.Diagnostics.Process myTestProcess = new System.Diagnostics.Process();

    myTestProcess.StartInfo.FileName = @c:filesjpg1.jpg;

Sign In or Register to comment.

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!