如何使用nuget的包在Mono中构建C#程序?

时间:2018-01-31 08:34:18

标签: c# .net mono nuget

我在Ubuntu 17.10上使用Mono 5.4.1.7编写C#代码。

这是我想要做的事情,全部来自命令行:

  1. 使用NuGet安装包(特别是MathNet.Numerics)。
  2. 编译一个使用该包中的类的C#程序。
  3. 运行程序。
  4. 但是我无法看到任何简单的方法,所以我必须遗漏一些东西。

    这是我尝试过的。我创建了一个目录' foo'对于我的节目。在那个目录中,我跑了

    $ nuget install MathNet.Numerics
    

    下载了MathNet.Numerics库并将其放在子目录“MathNet.Numerics.3.20.2'”中。到目前为止一切都很好。

    然后我创建了我的测试程序foo.cs,如下所示:

    using MathNet.Numerics.LinearAlgebra;
    using MathNet.Numerics.LinearAlgebra.Double;
    
    class Foo {
      static void Main() {
        Vector<double> A = DenseVector.OfArray(new double[] { 1, 2, 3, 4 });
      }
    }
    

    但现在我不能简单地使用mcs构建:

    $ mcs Foo.cs
    foo.cs(1,7): error CS0246: The type or namespace name `MathNet' could not be found. Are you missing an assembly reference?
    foo.cs(2,7): error CS0246: The type or namespace name `MathNet' could not be found. Are you missing an assembly reference?
    

    如果我明确指定已安装的程序集,则它可以工作:

    $ mcs -reference:MathNet.Numerics.3.20.2/lib/net40/MathNet.Numerics.dll foo.csfoo.cs(6,20): warning CS0219: The variable `A' is assigned but its value is never used
    Compilation succeeded - 1 warning(s)
    

    现在,如果我尝试运行生成的可执行文件,它将失败:

    $ mono foo.exe

    $ mono foo.exe
    Unhandled Exception:
    System.IO.FileNotFoundException: Could not load file or assembly 'MathNet.Numerics, Version=3.20.2.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies.
    File name: 'MathNet.Numerics, Version=3.20.2.0, Culture=neutral, PublicKeyToken=null'
    [ERROR] FATAL UNHANDLED EXCEPTION: System.IO.FileNotFoundException: Could not load file or assembly 'MathNet.Numerics, Version=3.20.2.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies.
    File name: 'MathNet.Numerics, Version=3.20.2.0, Culture=neutral, PublicKeyToken=null'
    

    仅当我将库DLL复制到当前目录时才有效:

    $ cp MathNet.Numerics.3.20.2/lib/net40/MathNet.Numerics.dll .
    $ mono foo.exe
    $
    

    所以是的,我找到了一种让它工作的方法,但是这看起来很尴尬,如果我使用NuGet中的许多不同的库,会更加尴尬。

    所以我必须遗漏一些东西。是否有一些我应该使用的构建系统会使所有这些都自动化?请注意,我在Linux上,并且宁可留在命令行而不是使用大型IDE(如MonoDevelop)。

1 个答案:

答案 0 :(得分:1)

正是这样的任务是构建系统的用途 - &gt;要么创建自己的构建脚本,为您完成工作,要么使用已经实现过的脚本,如已经提到过的MonoDevelop。 如果你想留在控制台上,可能只考虑.NET Core,因为有一个命令行构建工具/系统:https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-build?tabs=netcore2x