2014-09-12 33 views
1

我最近遇到了一個程序中的問題,以前工作正常。我跟蹤它到下面的代碼:使用SetDefaultDllDirectories中斷字體處理

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,全面更新,AMD的Radeon HD與最新的測試版驅動程序用於

背景:我需要的功能使用AddDllDirectory添加我的可執行文件路徑的子目錄(類似於C:/ MyProgram/myLibrariesX )

+2

Hmya,這是最糟糕的一種全球變量。有兩個版本的Gdiplus.dll,你基本上*從不*需要system32的compat版本,那種方式就是龍。這是一個XY問題,它肯定比*有更好的答案*。不僅限於有意避免給Windows帶來困難,只需將DLL複製到正確的位置即可。 – 2014-09-12 23:14:11

+1

我同意漢斯。換句話說,還有AFAIK,問題很簡單,.NET不支持對SetDefaultDllDirectories的調用。 – 2014-09-12 23:20:04

+0

同意。你需要解決問題的根源。 – 2014-09-13 06:06:24

回答

0

我無法在Windows 8.1 x64中重現Visual Studio 2013的問題,但我可以在Windows 7上重現該問題。所以現在似乎已經修復了。