@msdn=http://blogs.msdn.com/shawnfa/archive/2004/06/07/150378.aspx @pinvoke=http://pinvoke.net/$$$.htm Summary: Verify a strong name / manifest against a public key blob !!!!C# Signature: [DllImport("mscorsn.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.U1)] static extern bool StrongNameSignatureVerificationEx( [MarshalAs(UnmanagedType.LPWStr)]string wszFilePath, [MarshalAs(UnmanagedType.U1)]bool fForceVerification, [MarshalAs(UnmanagedType.U1)]ref bool pfWasVerified); !!!!User-Defined Types: None. !!!!Notes: This function is exported from mscorsn.dll in v1.0 and v1.1 of the .NET framework, but it will be moved to mscorwks.dll in v2.0. There is a shim in mscoree.dll which will redirect to the appropriate implementation dll, which has the same name. !!!!Tips & Tricks: The fForceVerification / pfWasVerified parameters can be confusion. A good blog entry to read, which explains how these work can be found here: http://blogs.msdn.com/shawnfa/archive/2004/06/07/150378.aspx See the supporting function below for the code to the CheckToken() function - it verifies that an assembly contains the correct token data. !!!!Sample Code: // check the signature first bool notForced = false; bool verified = StrongNameSignatureVerificationEx(assembly, false, ref notForced); Console.WriteLine("Verified: {0}\nForced: {1}", verified, !notForced); // check to see if it is a Microsoft assembly byte[] msClrToken = new byte[] { 0xb7, 0x7a, 0x5c, 0x56, 0x19, 0x34, 0xe0, 0x89 }; byte[] msFxToken = new byte[] { 0xb0, 0x3f, 0x5f, 0x7f, 0x11, 0xd5, 0x0a, 0x3a }; bool isMsAsm = CheckToken(assembly, msClrToken) || CheckToken(assembly, msFxToken); if(isMsAsm && verified && notForced) Console.WriteLine("Microsoft signed assembly"); else if(isMsAsm && verified && !notForced) Console.WriteLine("Microsoft delay signed assembly"); else if(isMsAsm && !verified) Console.WriteLine("Microsoft assembly, modified since signing"); else Console.WriteLine("Not a Microsoft assembly"); !!!!Supporting Function: /// <summary> /// Check an assembly to see if it has the given public key token /// </summary> /// <remarks> /// Does not check to make sure the assembly's signature is valid. /// Loads the assembly in the LoadFrom context. /// </remarks> /// <param name='assembly'>Path to the assembly to check</param> /// <param name='expectedToken'>Token to search for</param> /// <exception cref='System.ArgumentNullException'>If assembly or expectedToken are null</exception> /// <returns>true if the assembly was signed with a key that has this token, false otherwise</returns> public static bool CheckToken(string assembly, byte[] expectedToken) { if (assembly == null) throw new ArgumentNullException("assembly"); if (expectedToken == null) throw new ArgumentNullException("expectedToken"); try { // Get the public key token of the given assembly Assembly asm = Assembly.LoadFrom(assembly); byte[] asmToken = asm.GetName().GetPublicKeyToken(); // Compare it to the given token if (asmToken.Length != expectedToken.Length) return false; for (int i = 0; i < asmToken.Length; i++) if (asmToken[i] != expectedToken[i]) return false; return true; } catch (System.IO.FileNotFoundException) { // couldn't find the assembly return false; } catch (BadImageFormatException) { // the given file couldn't get through the loader return false; } } !!!!Alternative Managed API: None Documentation: None
Edit mscorsn.StrongNam...
You do not have permission to change this page. If you feel this is in error, please send feedback with the contact link on the main page.