C# 在OSX上使用MonoKickstart时未找到gdiplus.dll
我一直在使用MonoKickstart让我们的项目——它构建在OpenTK上——在OSX上运行。我让程序完全正常工作,但一旦我删除了Mono.framework(实际上是重命名的),就会出现以下错误:C# 在OSX上使用MonoKickstart时未找到gdiplus.dll,c#,macos,mono,system.drawing,opentk,C#,Macos,Mono,System.drawing,Opentk,我一直在使用MonoKickstart让我们的项目——它构建在OpenTK上——在OSX上运行。我让程序完全正常工作,但一旦我删除了Mono.framework(实际上是重命名的),就会出现以下错误: [ERROR] FATAL UNHANDLED EXCEPTION: System.TypeInitializationException: An exception was thrown by the type initializer for System.Drawing.GDIPlus ---
[ERROR] FATAL UNHANDLED EXCEPTION: System.TypeInitializationException: An exception was thrown by the type initializer for System.Drawing.GDIPlus ---> System.DllNotFoundException: gdiplus.dll
at (wrapper managed-to-native) System.Drawing.GDIPlus:GdiplusStartup (ulong&,System.Drawing.GdiplusStartupInput&,System.Drawing.GdiplusStartupOutput&)
at System.Drawing.GDIPlus..cctor () [0x00000] in <filename unknown>:0
--- End of inner exception stack trace ---
at System.Drawing.Bitmap..ctor (System.String filename, Boolean useIcm) [0x00000] in <filename unknown>:0
at System.Drawing.Bitmap..ctor (System.String filename) [0x00000] in <filename unknown>:0
at (wrapper remoting-invoke-with-check) System.Drawing.Bitmap:.ctor (string)
(...)
[ERROR]致命的未处理异常:System.TypeInitializationException:System.Drawing.GDIPlus的类型初始值设定项引发了异常-->System.DllNotFoundException:GDIPlus.dll
在(包装器管理为本机)System.Drawing.GDIPlus:GdiplusStartup(ulong&,System.Drawing.GdiplusStartupInput&,System.Drawing.GdiplusStartupOutput&)
位于System.Drawing.GDIPlus..cctor()[0x00000]中:0
---内部异常堆栈跟踪的结束---
位于System.Drawing.Bitmap..ctor(System.String文件名,布尔值useIcm)[0x00000]中:0
位于System.Drawing.Bitmap..ctor(System.String文件名)[0x00000]中:0
在(包装器远程处理通过检查调用)System.Drawing.Bitmap:.ctor(字符串)
(...)
我已尝试将mono安装中的“libgdiplus.0.dylib”添加到附带的osx文件夹(mono动态库也位于其中)和可执行文件文件夹中。创建dllmap除了更改错误消息中的文件名外,什么都不做
我使用的是sgen变体,因此在x64中运行不是问题所在(有关此问题的讨论,请参见)。此错误意味着mono无法找到您尝试使用的某个类所需的库 为了保持与.NET Framework的兼容性,mono使用与windows相同的库名称。这些名称使用DLLMAP映射到linux库名称 (将“.so”替换为MacOS X的“dylib”) 如果应用程序或assembly.config文件中的DllMap条目中未明确指定库位置,Mono将在以下几个位置搜索库: 从中加载引用图像的目录。 在任何地方,系统的动态加载程序都配置为查找共享库。例如,在Linux上,$LD_LIBRARY_PATH环境变量和/etc/LD.so.conf文件中指定了这一点。在windows上使用$PATH环境变量。 解决此问题的下一步是在系统上定位文件 $find/usr-名称libgdiplus.so /usr/local/lib/libgdiplus.so 啊哈!就在那里。那为什么mono找不到呢 默认情况下,在linux的所有发行版中,动态链接器只为/lib和/usr/lib中的文件创建缓存。因为您已经将库放在/usr/local/lib中,所以它不知道。可以使用以下命令对此进行验证: ldconfig-p | grep libgdiplus 该命令不应产生任何输出,因为它不知道该文件 解决此问题的正确方法是添加/usr/local/lib作为ldconfig索引的路径之一。为此,将路径添加到/etc/ld.so.conf,并以root用户身份运行“ldconfig”,这将强制重建缓存 动态链接器现在应该知道此路径中的所有库。您可以通过再次键入上述命令来验证这一点: $ldconfig-p | grep libgdiplus libgdiplus.so(libc6)=>/usr/local/lib/libgdiplus.so 耶!您的应用程序现在应该可以正常运行了 注意:如上所述,您还可以将$LD_LIBRARY_PATH环境变量设置为包含库的路径,但不建议这样做,因为它可能会导致其他问题,并且更难维护
有关更多信息,请查看您安装了哪个版本的Mono?(3.10与GDIPlus有问题)以及您是如何安装Mono的(最近用户从brew安装Mono时遇到问题(也与GDIPlus有问题)…使用我通过原始Mono dmg安装的Mono。我想我已经安装了3.12,但我不确定哪个版本嵌入了MonoKickstart(我看到有人提到mono 2.10.9,但我很确定我们的游戏根本不会在上面运行)。我将尝试使用一些可执行文件。我尝试使用boehm版本的Mono。然而,这仍然不能解决问题。我怀疑问题在于x64和x86之间的差异,但默认kick可执行文件的fat版本和x86版本都会导致相同的错误。我尝试用mono附带的libmono-2.0.1.dylib替换libmono-2.0.1.dylib,但这会导致以下错误:dyld:Symbol not found:_kcflocaleContryCode您使用的是哪个OSX版本?
find/-name\*gdiplus\*
在安装了mono 4.2.0的OSX Yosemite上不会产生任何效果。有什么想法吗?看起来我需要安装mono mdk,但是现在所需的库仍然没有被链接到,而且我无法找到ldconfig-p的OSX变体