Cómo instalar una fuente de Windows usando C #

¿Cómo puedo instalar una fuente usando C #?

Intenté copiar las fonts usando File.Copy() pero no estoy autorizado debido a las limitaciones de los derechos de acceso ( UnauthorizedException ).

¿Que debería hacer?

Necesitará un enfoque diferente para instalar las fonts.

  • Use un instalador (cree un proyecto de configuración) para instalar las fonts
  • Otro (más fácil) enfoque usando un método nativo.

Declara la importación dll:

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

En tu código:

  // Try install the font. result = AddFontResource(@"C:\MY_FONT_LOCATION\MY_NEW_FONT.TTF"); error = Marshal.GetLastWin32Error(); 

La fuente:

http://www.brutaldev.com/post/2009/03/26/Installing-and-removing-fonts-using-C

Lo armé en una prueba unitaria, espero que ayude:

 [TestFixture] public class Tests { // Declaring a dll import is nothing more than copy/pasting the next method declaration in your code. // You can call the method from your own code, that way you can call native // methods, in this case, install a font into windows. [DllImport("gdi32.dll", EntryPoint = "AddFontResourceW", SetLastError = true)] public static extern int AddFontResource([In][MarshalAs(UnmanagedType.LPWStr)] string lpFileName); // This is a unit test sample, which just executes the native method and shows // you how to handle the result and get a potential error. [Test] public void InstallFont() { // Try install the font. var result = AddFontResource(@"C:\MY_FONT_LOCATION\MY_NEW_FONT.TTF"); var error = Marshal.GetLastWin32Error(); if (error != 0) { Console.WriteLine(new Win32Exception(error).Message); } } } 

Eso debería ayudarte en tu camino 🙂

  internal static void InstalarFuente(string NombreFnt,string RutaFnt) { string CMD = string.Format("copy /Y \"{0}\" \"%WINDIR%\\Fonts\" ", RutaFnt); EjecutarCMD(CMD); System.IO.FileInfo FInfo = new System.IO.FileInfo(RutaFnt); CMD = string.Format("reg add \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts\" /v \"{0}\" /t REG_SZ /d {1} /f", NombreFnt, FInfo.Name); EjecutarCMD(CMD); } public static void EjecutarCMD(string Comando) { System.Diagnostics.ProcessStartInfo Info = new System.Diagnostics.ProcessStartInfo("cmd.exe"); Info.Arguments = string.Format("/c {0}", Comando); Info.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; System.Diagnostics.Process.Start(Info); } 
    Intereting Posts