所以我试图使用Visual Studio 2019 Community Edition在Mac OS Mojave上编写C#应用程序。我正在使用一个名为SFML.Net的库。有一个C绑定,称为CSFML。似乎SFML.Net使用CSFML动态库(即libcsfml-graphics.2.5.0.dylib
)来进行底层工作。
我创建了一个C#项目并添加了SFML.Net NuGet。至此,项目 builds 正常运行,没有错误。但是,如果我运行项目,则会收到System.DllNotFoundException
,消息仅为csfml-graphics
。
SFML.Net download page现在要说的是:
由于它是.Net库,因此每个体系结构只有一个存档, 适用于任何操作系统和编译器。但是,由于CSFML的名称 库出现在源代码中,并且在每个操作系统上都不同,对于 在OS X和Linux中,您将必须编写一个特殊的配置文件 将CSFML DLL的名称映射到 操作系统上对应的CSFML共享库(例如, “ csfml-graphics-2.dll”->“ libcsfml-graphics.so.2”);有关更多详细信息,请参见the Mono documentation。
因此,我将.dylib
文件复制到了项目的bin / Debug文件夹中。现在,根据该Mono文档链接,我可以在Mono中执行一个简单的DLL映射:
<configuration>
<dllmap dll="csfml-graphics.dll" target="libcsfml-graphics.2.5.0.dylib"/>
</configuration>
不幸的是,根据this Microsoft documentation,Visual Studio for Mac似乎不再使用Mono:
MSBuild是由Microsoft开发的构建引擎,可用于 主要是.NET应用程序的构建。 Mono框架也有 它自己的Microsoft Build Engine实现,称为xbuild。 但是,xbuild已被淘汰,赞成在所有版本上使用MSBuild 操作系统。
MSBuild主要用作以下项目的构建系统: Mac版Visual Studio。
MSBuild中是否有Mono的dllmap
类似物?我需要告诉.Net运行时,它应该寻找csfml-graphics.dll
而不是寻找libcsfml-graphics.2.5.0.dylib
。
更新:
在我添加的Mono全局配置文件中
<dllmap dll="csfml-graphics" target="libcsfml-graphics.2.5.0.dylib" />
这将DllNotFoundException
消息更改为libcsfml-graphics.2.5.0.dylib
。因此,我猜想映射是有效的,但是现在我不确定为什么Mono无法找到DLL。它位于我的项目的bin/Debug
文件夹中。
我尝试将.dylib
放在名为~/CSFML
的文件夹中,并将配置行更改为
<dllmap dll="csfml-graphics" target="~/CSFML/libcsfml-graphics.2.5.0.dylib" />
我认为绝对路径可能会起作用。不幸的是,这仍然给出了DllNotFoundException
,但现在这则消息显示了~/CSFML/libcsfml-graphics.2.5.0.dylib
...
更新2:
我尝试按照this tutorial的方法在Mac上设置SFML.Net。我执行了使用InstallNameToolGUI更改.dylib
的ID的步骤。我从@rpath/libcsfml-graphics.2.5.0.dylib
更改为libcsfml-graphics.2.5.0.dylib
。
我应注意,我已将Mono配置文件中的DLL映射还原回
<dllmap dll="csfml-graphics" target="libcsfml-graphics.2.5.0.dylib" />
我仍然将DllNotFoundException
和消息发送给libcsfml-graphics.2.5.0.dylib