当将FixedDocument序列化为XPS时,我有时会FileFormatException告诉我字体的格式(我假设)不符合预期的文件格式规范(请参阅下面的例外).
神秘的部分是:
有人知道为什么会发生这种情况(特别是为什么它不会一直发生但只是在不可预测的时间间隔内)?
遵循最小可重复性示例将在每次运行时触发异常约4至5次(在我的Windows 10计算机上,发生在.NET 4,4.6.1等):
private void TestXpsSerialization(object a)
{
for (int i = 0; i < 400; ++i)
{
TextBlock block = new TextBlock
{
Text = "Test",
FontFamily = new FontFamily("Segoe UI"),
FontStyle = FontStyles.Italic,
FontWeight = FontWeights.Bold,
Background = null,
FontSize = 12
};
FixedDocument fixedDoc = new FixedDocument();
PageContent pageContent = new PageContent();
FixedPage fixedPage = new FixedPage();
fixedPage.Children.Add(block);
((IAddChild) pageContent).AddChild(fixedPage);
fixedDoc.Pages.Add(pageContent);
using (MemoryStream documentStream = new MemoryStream())
{
string …Run Code Online (Sandbox Code Playgroud) 编辑:现在让它工作,同时规范化mantiss,首先设置隐含位是很重要的,当解码隐含位然后不必添加.我将标记的答案保留为正确,因为那里的信息确实有帮助.
我目前正在实现编码(专有编码规则),并且编码双值时会有轻微问题.
所以,我可以通过使用以下方式从c#中的double中取出符号,指数和尾数:
// get parts
double value = 10.0;
long bits = BitConverter.DoubleToInt64Bits(value);
// Note that the shift is sign-extended, hence the test against -1 not 1
bool negative = (bits < 0);
int exponent = (int)((bits >> 52) & 0x7ffL);
long mantissa = bits & 0xfffffffffffffL;
Run Code Online (Sandbox Code Playgroud)
(使用此处的代码).这些值可以编码,过程的简单反转将使我恢复原来的双倍.
但是,DER编码规则指定应该对尾数进行规范化:
在规范编码规则和可分辨编码规则中,规定了归一化,并且尾数(除非它是0)需要重复移位,直到最低有效位为1.
(见8.5.6.5节).
手动执行此操作:
while ((mantissa & 1) == 0)
{
mantissa >>= 1;
exponent++;
}
Run Code Online (Sandbox Code Playgroud)
不行,并给我奇怪的价值观.(即使使用Jon Skeet在上述链接中发布的整个功能).
我似乎在这里遗漏了一些东西,如果我第一次能够规范化双重的mantiassa并得到"位",那将是最简单的.但是,我也无法真正理解为什么手动标准化将无法正常工作.
谢谢你的帮助,
丹尼
编辑:实际工作问题显示我的mantiss规范化问题:
static void Main(string[] args)
{ …Run Code Online (Sandbox Code Playgroud) 我正在使用这些Microsoft.Deployment.WindowsInstaller库从 .msi 文件中读出值。属性没问题,summary-information也可以读出,例如:
static void Main(string[] args)
{
using (var database = new QDatabase(@"C:\myMsi.msi", DatabaseOpenMode.ReadOnly))
{
Console.WriteLine(database.ExecutePropertyQuery("ProductVersion"));
Console.WriteLine(database.ExecutePropertyQuery("ProductName"));
Console.WriteLine(database.ExecutePropertyQuery("Manufacturer"));
Console.WriteLine(database.ExecutePropertyQuery("ARPREADME"));
}
}
Run Code Online (Sandbox Code Playgroud)
该QDatabase对象甚至有一个很好的SummaryInfo属性,保存摘要信息。但是,我还没有找到如何获取 .MSI 所针对的平台。
好像可以读出平台,因为Orca也是这样做的(在Orca中打开Summary Information就可以看到平台)。
我怎样才能获得 .msi 所针对的平台?