2015-11-13 153 views
0

我有一个应该安装字体的Windows服务。我有一个包含的字体文件夹,我用这个代码进行安装:Windows服务:安装字体

[DllImport("gdi32.dll", EntryPoint = "AddFontResourceW", SetLastError = true)] 
    public static extern int AddFontResource([In][MarshalAs(UnmanagedType.LPWStr)] 
            string lpFileName); 


var fontDestination = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), fontName); 

     if (File.Exists(fontDestination)) 
     { 
      return; 
     } 

     logger.Info(String.Format("Installing font: {0}", fontName)); 

     try 
     { 
      File.Copy(fontFullPath, fontDestination); 

      // Retrieves font name 
      var fontCollection = new PrivateFontCollection(); 
      fontCollection.AddFontFile(fontDestination); 
      var actualFontName = fontCollection.Families[0].Name; 

      //Add font 
      AddFontResource(fontDestination); 
      var error = Marshal.GetLastWin32Error(); 
      if (error == 0) 
      { 
       //Add registry entry 
       logger.Info(String.Format("Font {0} installed successfully", fontName)); 
       Registry.SetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts", 
        actualFontName, fontName, RegistryValueKind.String); 
      } 

的字体将在fontDestination被复制(Environment.GetFolderPath(Environment.SpecialFolder.Fonts)),然后将AddFontResource将它添加到会话中。

如果我将该服务作为控制台应用程序或以调试模式运行,则一切均按预期工作。字体在记事本,单词等中可用,无需重新启动机器。 如果我安装它并将其作为服务运行,则日志会确认该字体已成功安装,添加了注册表,该文件位于Windows/fonts文件夹中,但在使用它的应用程序中不可用(记事本,单词等)

如果我重新启动计算机,我怀疑Windows在注册表中看起来,看到Windows/fonts文件夹中的文件,并使其可供应用程序使用。 编辑:它实际上是重新启动后可用。

我需要在不会重新启动的虚拟机上运行此服务,因此我需要字体在安装后立即可用。

我怀疑这与服务的用户权限有关。我指定该服务以LocalSystem身份登录。

+0

哪一部分的说:“我怀疑”是怀疑,什么它的一部分实际发生的?它目前措辞的方式表明所有部分都是猜测,所以:*是*重新启动后可用的字体? –

+0

是的,如果它们是从Windows服务安装的,它们在重新启动后可用。如果我运行我在控制台应用程序中发布的代码(或者将该服务作为控制台应用程序运行),那么它们在不重新启动的情况下可用。 –

+0

都以管理员身份运行? (即使用管理员凭证安装的服务,并且控制台以管理员身份运行?) –

回答

0

尝试禁用或重新启动字体高速缓存中的窗口服务