使用SetDefaultDllDirectories打破字体处理

时间:2014-09-12 23:01:28

标签: .net winforms winapi fonts gdi

我最近在一个曾经工作正常的程序中遇到了问题。我将其跟踪到以下代码:

using System.Drawing;
using System.Runtime.InteropServices;

namespace Foo
{
    static class CProgram
    {
        [DllImport("kernel32.dll", CallingConvention = CallingConvention.StdCall)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool SetDefaultDllDirectories(int directoryFlags);

        public const int LOAD_LIBRARY_SEARCH_DEFAULT_DIRS = 0x000001000;

        private static void Main()
        {
            SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_DEFAULT_DIRS);
            Font font = SystemFonts.DefaultFont;
        }
    }
}

一旦我使用SetDefaultDllDirectories除了零作为参数,程序崩溃。我将它追溯到SafeNativeMethods.Gdip.GdipGetGenericFontFamilySansSerif(out fontfamily);它简称为“GdipGetGenericFontFamilySansSerif”。但是这个调用因FontFamilyNotFound错误而失败。

它没有SetDefaultDllDirectories。如果我在调用之前和之后放置字体赋值,它甚至可以工作。

我的系统上是否有任何导致此问题的内容,或者是MS导致此错误的更新?

系统:Win7 x64,完全更新,使用最新beta驱动程序的AMD Radeon HD

背景:我需要该函数来使用AddDllDirectory来添加我的可执行文件路径的子目录(类似于C:/ MyProgram / myLibrariesX)

2 个答案:

答案 0 :(得分:0)

我无法在Windows 8.1 x64中重现Visual Studio 2013的问题,而我可以在Windows 7上重现它。所以它现在似乎已修复。

答案 1 :(得分:0)

我遇到了同样的问题,因为我需要在基本文件夹下的体系结构文件夹(即x86和x64)中找到本机库。我所使用的解决方法是将体系结构特定的文件夹附加到PATH环境变量中。

.innerText

PATH不用于assembly probing,而是用于native DLL probing。对于程序集,我使用了AppDomain.CurrentDomain.AssemblyResolve事件。