单声道操作系统特定DLL

时间:2014-04-19 08:00:31

标签: .net linux dll mono operating-system

有没有人知道如何在Mono / .Net中指定特定于操作系统的DLL?

我有两个DLL,一个引用托管代码的linux_taxes.dll和windows_taxes.dll。 (实际上它们都有相同的名称)如果我使用windows_taxes.dll,它在windows中编译得很好,如果我使用linux_taxes.dll,它在linux中编译得很好。由于它们具有相同的名称(实际上)我只有一个对tax.dll的引用,只是根据我所在的操作系统手动覆盖dll。这是一个痛苦,我想知道是否有一种方法可以自动化这个DLL覆盖,甚至更好地指向特定的DLL在Linux上,并指向我在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中,但我不确定如何制作特定于单声道的目标来实现这一点。

任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用app.config中的dllmap指令将程序集中P / Invoke引用的非托管共享库映射到其他非托管共享库。 似乎dllmap对你没有用,因为如果我正确理解你的问题你有两个托管库a.k.a. assembly:

  1. 适用于Windows的taxes.dll
  2. 适用于Linux的taxes.dll
  3. 你说这两个程序集在文件系统级别是可以互换的,所以我猜它们实现完全相同的接口,类等。关于.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文件并向程序集引用添加条件。有关如何执行此操作的详细说明,请参阅此answerreferenced article