 <p>The "traditional" ways of using <code>AssemblyName.GetAssemblyName(string)</code> or <code>FileVersionInfo</code> won't work as they aren't supported on .NET CF. To do this without using <code>Assembly.LoadFrom</code>, you will need to use P/Invoke to natively get the file version information. You can try this code (<em><strong>untested</strong></em>):</p> <pre><code>[DllImport("coredll", EntryPoint = "GetFileVersionInfo", SetLastError = true)] private static extern bool GetFileVersionInfo(string filename, int handle, int len, IntPtr buffer); [DllImport("coredll", EntryPoint = "GetFileVersionInfoSize", SetLastError = true)] private static extern int GetFileVersionInfoSize(string filename, ref int handle); [DllImport("coredll", EntryPoint = "VerQueryValue", SetLastError = true)] private static extern bool VerQueryValue(IntPtr buffer, string subblock, ref IntPtr blockbuffer, ref int len); public static Version GetFileVersionCe(string fileName) { int handle = 0; int length = GetFileVersionInfoSize(fileName, ref handle); Version v = null; if (length &gt; 0) { IntPtr buffer = System.Runtime.InteropServices.Marshal.AllocHGlobal(length); if (GetFileVersionInfo(fileName, handle, length, buffer)) { IntPtr fixedbuffer = IntPtr.Zero; int fixedlen = 0; if (VerQueryValue(buffer, "\\", ref fixedbuffer, ref fixedlen)) { byte[] fixedversioninfo = new byte[fixedlen]; System.Runtime.InteropServices.Marshal.Copy(fixedbuffer, fixedversioninfo, 0, fixedlen); v = new Version( BitConverter.ToInt16(fixedversioninfo, 10), BitConverter.ToInt16(fixedversioninfo, 8), BitConverter.ToInt16(fixedversioninfo, 14), BitConverter.ToInt16(fixedversioninfo, 12)); } } Marshal.FreeHGlobal(buffer); } return v; } </code></pre>