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身份登录。
哪一部分的说:“我怀疑”是怀疑,什么它的一部分实际发生的?它目前措辞的方式表明所有部分都是猜测,所以:*是*重新启动后可用的字体? –
是的,如果它们是从Windows服务安装的,它们在重新启动后可用。如果我运行我在控制台应用程序中发布的代码(或者将该服务作为控制台应用程序运行),那么它们在不重新启动的情况下可用。 –
都以管理员身份运行? (即使用管理员凭证安装的服务,并且控制台以管理员身份运行?) –