public static extern bool UpdateResource(ResourceUpdateHandle hUpdate, IntPtr type, IntPtr name, ushort wLanguage, byte[] lpData, int cbData);
public bool Execute() { if (NativeMethods.GetFileVersionInfoSize(Source.ItemSpec) > 0) { return(true); // Nothing to do } try { if (Directory.Exists(TempDir)) { Directory.Delete(TempDir, true); } Directory.CreateDirectory(TempDir); string srcFile = Source.ItemSpec; string tmpFile = Path.Combine(TempDir, Path.GetFileName(Source.ItemSpec)); Assembly myAssembly = typeof(UpdateNativeVersionResource).Assembly; AppDomainSetup setup = new AppDomainSetup(); setup.ApplicationName = "GenerateVersionInfoViaAssembly"; setup.ApplicationBase = Path.GetDirectoryName(new Uri(myAssembly.CodeBase).LocalPath); setup.AppDomainInitializer = new AppDomainInitializer(ResourceRefresh.OnRefreshVersionInfo); setup.AppDomainInitializerArguments = new string[] { Source.ItemSpec, TempDir, tmpFile }; AppDomain dom = AppDomain.CreateDomain("AttributeRefresher", myAssembly.Evidence, setup); AppDomain.Unload(dom); // Remove locks byte[] versionInfo; int size = NativeMethods.GetFileVersionInfoSize(tmpFile); if (size >= 0 && NativeMethods.GetFileVersionInfo(tmpFile, size, out versionInfo)) { File.Delete(tmpFile); BuildEngine.LogMessageEvent(new BuildMessageEventArgs("Updating version resources", null, "UpdateNativeVersionResouce", MessageImportance.Normal)); using (ResourceUpdateHandle resHandle = NativeMethods.BeginUpdateResource(srcFile, false)) { if (resHandle != null) { bool ok = NativeMethods.UpdateResource(resHandle, (IntPtr)16, (IntPtr)1, 0, versionInfo, size); ok = resHandle.Commit() && ok; if (ok) { if (!string.IsNullOrEmpty(KeyContainer) || (KeyFile != null && !string.IsNullOrEmpty(KeyFile.ItemSpec))) { BuildEngine.LogMessageEvent(new BuildMessageEventArgs("Resigning assembly", null, "UpdateNativeVersionResouce", MessageImportance.Normal)); if (!ResignAssemblyWithFileOrContainer(srcFile, (KeyFile != null) ? KeyFile.ItemSpec : null, KeyContainer)) { BuildEngine.LogMessageEvent(new BuildMessageEventArgs("Resigning assembly failed", null, "UpdateNativeVersionResouce", MessageImportance.High)); return(false); } } SourceUpdated = true; return(true); } } } } else { File.Delete(tmpFile); } BuildEngine.LogMessageEvent(new BuildMessageEventArgs("Updating version resources failed", null, "UpdateNativeVersionResouce", MessageImportance.Normal)); return(false); } finally { if (!SourceUpdated && File.Exists(Source.ItemSpec)) { File.Delete(Source.ItemSpec); // Ensure relinking in next build } } }