我最近在一个曾经工作正常的程序中遇到了问题。我将其跟踪到以下代码:
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)
答案 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事件。