internal static extern HRESULT PrjUpdateFileIfNeeded(
     IntPtr namespaceVirtualizationContext,
     [MarshalAs(UnmanagedType.LPWStr)] String destinationFileName,
     [MarshalAs(UnmanagedType.LPStruct)] PRJ_PLACEHOLDER_INFO placeholderInfo,
     int placeholderInfoSize,
     PRJ_UPDATE_TYPES updateFlags,
     out PRJ_UPDATE_FAILURE_CAUSES failureReason
     );
        internal static NativeBuffer <PRJ_PLACEHOLDER_INFO> PRJ_PLACEHOLDER_INFOFromPlaceholderInfo(PlaceholderInfo original)
        {
            var ph = new PRJ_PLACEHOLDER_INFO
            {
                FileBasicInfo = PRJ_FILE_BASIC_INFOFromBasicInfo(original.BasicInfo),
                VersionInfo   = PRJ_PLACEHOLDER_VERSION_INFOFromPlaceholderVersion(original.Version)
            };

            if (original.Security == null)
            {
                return(new NativeBuffer <PRJ_PLACEHOLDER_INFO>(ph));
            }
            var securityBuffer = original.Security.GetSecurityDescriptorBinaryForm();

            ph.SecurityInformation.OffsetToSecurityDescriptor = Marshal.SizeOf <PRJ_PLACEHOLDER_INFO>();
            ph.SecurityInformation.SecurityBufferSize         = securityBuffer.Length;
            return(new NativeBuffer <PRJ_PLACEHOLDER_INFO>(ph, securityBuffer));
        }