}
-HANDLE ZapImage::SaveImage(LPCWSTR wszOutputFileName, CORCOMPILE_NGEN_SIGNATURE * pNativeImageSig)
+HANDLE ZapImage::SaveImage(LPCWSTR wszOutputFileName, LPCWSTR wszDllPath, CORCOMPILE_NGEN_SIGNATURE * pNativeImageSig)
{
if (!IsReadyToRunCompilation())
{
// that native images are resoure-only DLLs. It is important to NOT
// be a resource-only DLL because those DLL's PDBS are not put up on the
// symbol server and we want NEN PDBS to be placed there.
- ZapPEExports* exports = new(GetHeap()) ZapPEExports(wszOutputFileName);
+ ZapPEExports* exports = new(GetHeap()) ZapPEExports(wszDllPath);
m_pDebugSection->Place(exports);
SetDirectoryEntry(IMAGE_DIRECTORY_ENTRY_EXPORT, exports);
void AllocateVirtualSections();
- HANDLE SaveImage(LPCWSTR wszOutputFileName, CORCOMPILE_NGEN_SIGNATURE * pNativeImageSig);
+ HANDLE SaveImage(LPCWSTR wszOutputFileName, LPCWSTR wszDllPath, CORCOMPILE_NGEN_SIGNATURE * pNativeImageSig);
void Preload();
void LinkPreload();
DefineOutputAssembly(strAssemblyName, &hashAlgId);
SString strNativeImagePath;
+ SString strNativeImageTempPath;
HANDLE hFile = INVALID_HANDLE_VALUE;
StackSArray<HANDLE> hFiles;
pAssemblyModule->SetPdbFileName(SString(strAssemblyName, SL(W(".ni.pdb"))));
- hFile = pAssemblyModule->SaveImage(strNativeImagePath.GetUnicode(), pNativeImageSig);
+ strNativeImageTempPath = strNativeImagePath;
+ strNativeImageTempPath.Append(W(".tmp"));
+
+ hFile = pAssemblyModule->SaveImage(strNativeImageTempPath.GetUnicode(), strNativeImagePath.GetUnicode(), pNativeImageSig);
}
// Throw away the assembly if we have hit fatal error during compilation
CloseHandle(*i);
}
+ if (!WszMoveFileEx(strNativeImageTempPath.GetUnicode(), strNativeImagePath.GetUnicode(), MOVEFILE_REPLACE_EXISTING))
+ {
+ ThrowLastError();
+ }
+
if (!m_pOpt->m_silent)
{
GetSvcLogger()->Printf(W("Native image %s generated successfully.\n"), strNativeImagePath.GetUnicode());