Try this:
LPOPENFILENAMEEX t = new LPOPENFILENAMEEX();
t.lStructSize = Marshal.SizeOf(typeof(LPOPENFILENAMEEX));
t.hInstance = GetModuleHandle(null);
t.hwndOwner = this.Handle;
t.Flags = 2;
t.lpstrFilter = "All Files (*.*)\0*.*\0";
t.lpstrFile = Marshal.AllocHGlobal(250);
t.nMaxFile = 250;
t.lpstrTitle = "Select";
if (GetOpenFileNameEx(ref t))
MessageBox.Show(Marshal.PtrToStringUni(t.lpstrFile));
Marshal.FreeHGlobal(t.lpstrFile);
....
public struct LPOPENFILENAMEEX
{
public int lStructSize;
public IntPtr hwndOwner;
public IntPtr hInstance;
[MarshalAs(UnmanagedType.LPTStr)]
public string lpstrFilter;
[MarshalAs(UnmanagedType.LPTStr)]
public string lpstrCustomFilter;
public int nMaxCustFilter;
public int nFilterIndex;
public IntPtr lpstrFile;
public int nMaxFile;
[MarshalAs(UnmanagedType.LPTStr)]
public string lpstrFileTitle;
public int nMaxFileTitle;
[MarshalAs(UnmanagedType.LPTStr)]
public string lpstrInitialDir;
[MarshalAs(UnmanagedType.LPTStr)]
public string lpstrTitle;
public int Flags;
public short nFileOffset;
public short nFileExtension;
[MarshalAs(UnmanagedType.LPTStr)]
public string lpstrDefExt;
public IntPtr lCustData;
public IntPtr lpfnHook;
[MarshalAs(UnmanagedType.LPTStr)]
public string lpTemplateName;
// Extended fields
public int dwSortOrder;
public int ExFlags;
}
[DllImport("coredll.dll")]
private static extern IntPtr GetModuleHandle(string m);
[DllImport("Aygshell.dll")]
private static extern bool GetOpenFileNameEx(ref LPOPENFILENAMEEX lpofnex);