有谁知道如何在 Mono/.Net 中指定特定于操作系统的 DLL?
我有两个 DLL,一个引用托管代码的 linux_taxes.dll 和 windows_taxes.dll。 (实际上它们都有相同的名称)如果我使用 windows_taxes.dll,它在 Windows 中编译得很好,如果我使用 linux_taxes.dll,它在 Linux 中编译得很好。由于它们具有相同的名称(实际上),我只有一个对 taxs.dll 的引用,并且只是根据我使用的操作系统手动覆盖 dll。这很痛苦,我想知道是否有一种方法可以自动覆盖此 DLL,或者甚至更好地在 Linux 上指向特定的 DLL,而在 Windows 上指向另一个 DLL。我调查了Config DLL maps使用与此类似的代码:
<dllmap os="linux" dll="taxes.dll" target="linux_taxes.dll"></dllmap>
<dllmap os="windows" dll="taxes.dll" target="windows_taxes.dll"></dllmap>
但这没有用,我想我可能正朝着错误的方向前进......
我也在想,也许我可以制作一个自定义目标,将正确的 DLL 从某个子文件夹复制到 bin,但我不确定如何制作特定于 mono 的目标来执行此操作。
如有任何帮助,我们将不胜感激。谢谢!
最佳答案
您使用 app.config 中的 dllmap 指令将程序集中 P/Invoke 引用的 unmanaged 共享库映射到不同的 unmanaged 共享库。 似乎 dllmap 对你没有用,因为如果我正确理解你的问题,你有两个 managed 库 a.k.a. 程序集:
- 适用于 Windows 的 taxes.dll
- 适用于 Linux 的 taxes.dll
你说这两个程序集在文件系统级别是可以互换的,所以我猜他们实现了完全相同的接口(interface)、类等。.NET/Mono 程序集最美妙的地方是它们可以很容易地在不同的平台上使用,而不需要重建。您的代码可以在运行时检测执行平台并为该平台使用适当的代码,即:
if ((System.Environment.OSVersion.Platform == System.PlatformID.Unix) ||
(System.Environment.OSVersion.Platform == System.PlatformID.MacOSX))
{
// Code for Unix platform
}
else
{
// Code for Windows platform
}
我相信将您的两个程序集合并为一个多平台程序集将是最方便的解决方案,并且可以一劳永逸地解决您的问题,但是这当然需要您更改这两个程序集的实现。
除此之外,您始终可以创建名为“Linux”的新解决方案配置(对于调试版本甚至是“LinuxDebug”,对于发布版本甚至是“LinuxRelease”)手动编辑 csproj 文件并向程序集引用添加条件。看这个answer和 referenced article有关如何执行此操作的详细说明。
关于.net - 单操作系统特定 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23167539/