2016-10-03 3 views
0

Добавление частного шрифта отлично работает на моей локальной машине с Windows 10 Pro. Однако в Windows Server 2012 R2 те же код приводит к следующей ошибке:PrivateFontCollection.AddFontFile() генерирует общее исключение ошибки GDI +

System.Runtime.InteropServices.ExternalException: A generic error occurred in GDI+. at System.Drawing.Text.PrivateFontCollection.AddFontFile(String filename)

var privateFontCollection = new PrivateFontCollection(); 
privateFontCollection.AddFontFile("Roboto-Regular.ttf"); 

При удалении файла он приводит к NotFoundException, так что путь к файлу должен быть правильным. Я гарантировал, что каждый пользователь имеет все возможные разрешения на файл. (Я выяснил, что если я откажу в каждом разрешении на моем локальном компьютере с выигрышем 10, произойдет такая же «общая ошибка», что может быть проблемой разрешения)

У кого-нибудь есть решение этой проблемы? Невозможно ли, чтобы пользователь службы на производительной машине не обладал некоторыми другими правами, необходимыми для «установки» частных шрифтов? Возможно, шрифт устанавливается в определенный каталог, который не разрешен, но я не мог узнать, где это будет. Пожалуйста, помогите мне с этой самой объясняющей «общей ошибкой».

ответ

0

Кажется, что проблема была не в использовании абсолютного пути. Сначала не думал об этом, потому что удаление файла привело к явному FileNotFound. Использование абсолютного пути сделало трюк.

+0

Это происходит от плохого к худшему, вы не можете вызвать FreeCoTaskMem() до тех пор, пока * после * вы не назовете PrivateFontCollection.Dispose(). Ошибка памяти, как правило, слишком тонкая, чтобы заметить, она не бросает AVE достаточно часто. Первоначальная проблема, вероятно, является чем-то очень глупым, но вы не можете узнать, пока не используете, скажем, File.ReadAllBytes (путь), чтобы получить лучшее исключение. * Всегда * используйте полное имя пути, c: \ foo \ bar \ baz.ttf вместо baz.ttf. –

+0

Спасибо, что указал @HansPassant. –