如何使用Mono编译Visual Studio C#项目

61

我是新手,不知道从哪里开始。

我想要通过命令行在Linux上使用Mono编译Visual Studio C#项目。

main.cs文件包含以下引用:

using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Xml;
using iTextSharp.text;
using iTextSharp.text.pdf;

我不知道是否需要注明编译器的引用,或者它是否会自行拉取它们,是否会知道在哪里查找它们。我以前从未做过这样的事情。但我只需要编译这个项目。

谢谢!


2
有一种方法可以找出答案:将代码粘贴到Mono项目中,然后尝试编译它。编译器会比我们告诉您哪些引用可用、哪些不可用更快地抱怨。Mono具有相当全面的.NET库覆盖范围,因此它可能可以直接使用。 - Robert Harvey
你尝试过在MonoDevelop中打开Visual Studio解决方案吗? - dtb
说实话,我完全不知道从哪里开始。我什么都不懂,也不知道MonoDevelop是什么。而且我正在尝试在Linux命令行上编译它。在Windows上编译的Mono应用程序能在Linux上运行吗?我认为我只需要在Linux上编译它才能在Linux上运行。 - Alasdair
好的,我弄清楚了MonoDevelop是Mono的开发部分。我将尝试在Windows上安装它,并尝试编译它,就像建议的那样。然后看看可执行文件是否在Linux上运行。 - Alasdair
它找不到iTextSharp库...我在项目目录中有itextsharp.dll。我该如何将其指向那里? - Alasdair
monocs main.cs 曾经是我在 Linux 上的做法。 - Icarus
5个回答

32
您尝试过 xbuild 吗?它是 Mono 世界中的 MSBuild 等效工具。如果 MSBuild 能够在 Windows 上编译您的项目,则 xbuild 应该能够在 Linux 上执行同样的操作(如果不能,请在 Bugzilla 中报告错误)。 更新:现在,Mono 开发者/打包人员正在打包原始的(最近开源的)MSBuild,这是跨平台的。例如,在最新的 Mac Mono 安装程序中已经可以使用命令行程序msbuild来构建您的项目/解决方案(请注意:要被 Linux 发行版打包还有很长的路要走,因为 msbuild 依赖于 NuGet 包,即二进制 Blob)。

30

knocte是正确的,安装mono-complete

apt-get install mono-complete

我不知道为什么,但是只安装了mono-xbuild后,在命令行运行时会出现编译错误。

xbuild yourvisualcsharpproject.csproj

对我来说,它显示“此项目未设置输出路径”。 - Varadha31590
你尝试过这个吗: https://dev59.com/O2ox5IYBdhLWcg3wnllI - Oli
xbuild 工具已被弃用,并将在未来的更新中被移除,请改用 msbuild。 - Raymondo Ponte

11

Mono和.NET Framework在可用功能方面并不等同。

例如,Mono提供跨平台功能,但没有实现一些由.NET Framework提供的与Windows相关的功能。 因此,您不能在Windows上使用.NET编译,并期望它在Unix / Mono上运行顺畅: 它可能工作,但失败的机会很高。 实际上,程序越复杂,失败的概率就越高(您可能使用了Mono中不可用的内容)。

使用命令行工具Xbuild编译:

如果您想从命令行针对Mono编译.sln / .csproj文件,则xbuild(MSBuild的Mono克隆版)是正确的选择:

xbuild mysolution.sln
xbuild myproject.csproj

在Ubuntu上的xbuild手册页面

xbuild.exe位于Mono安装中,很可能位于:

C:\Program Files (x86)\Mono\lib\mono\4.5

从IDE (VS)编译

您可以使用MonoHelper插件(在Visual Studio中使用xbuild)在Windows上针对Mono进行编译。

还有另一种解决方案,即从Visual Studio针对“Mono”.NET Framework配置文件进行目标设置。 以下步骤来自 此处

注意: 我试过在4.5中更改配置文件的位置(但是那不起作用;要么vs找不到它,要么它被检测为未安装),因此始终使用v4.0目录来安装基于v4.0 VM的配置文件。这种限制以及“Profile”已被停止使用的事实使我认为它不适用于更高版本的工具。

同样的配置文件技巧也适用于Unity。

  1. 创建两个注册表键:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.0,Profile=Mono

    HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.0,Profile=Mono

  2. 在Microsoft References Assemblies目录中创建指向Mono目录的链接 (您可能需要以管理员身份运行以下命令)

    cd "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Profile" mklink /d Mono "C:\Program Files (x86)\Mono\lib\mono\4.5" cd Mono mkdir RedistList cd RedistList notepad FrameworkList.xml

  3. 编辑FrameworkList.xml

将以下内容粘贴到FrameworkList.xml

<?xml version="1.0" encoding="utf-8"?>
<FileList  Redist="Mono-4.5" Name="Mono 4.5 Profile" RuntimeVersion="4.5" ToolsVersion="4.0" > </FileList>
  1. 在 Visual Studio 项目应用选项卡中更改框架目标

使用 MonoDevelop/Xamarin Studio 进行编译

MonoDevelop 可在 Unix 和 Windows 上运行,并且可以轻松地从 .Net 编译/调试/运行切换到 Mono 编译/调试/运行。然而,尽管 MonoDevelop 对于 C# 季节性开发人员来说相当高效,但它还没有达到与 Visual Studio 和 Resharper 结合的强大之处。


1
这个限制以及“Profile”已经停用的事实使我认为它在更高版本的工具中不会起作用。你能否解释一下为什么它在更高版本的工具中不起作用?在我看来,你可以将链接到任何版本的Mono(当前是4.5,但将来可能是4.6或4.7),并且引用的程序集将指向Mono的程序集。 - Cristian M
@CristianM 我不知道它是否仍然适用于Visual Studio 2017。Mono是.NET框架的克隆,定义了工具集的规范。由于Mono / Xamarin和Microsoft现在合作并发布了.NET Core,我没有时间检查场景是否仍适用于更高版本,如果您有任何问题(使用4.6或4.7),我认为它将不会得到MS的支持。 - Fab
1
好的。谢谢您的回答! - Cristian M

10
你可以在Visual Studio中构建,然后在Linux上部署并在mono下运行。请查看这个文章

关于iTextSharp库... Visual Studio说找不到它,即使itextsharp.dll在项目目录中。我该如何指向它,你可以看到它已经包含在引用中了。 - Alasdair
我不确定你的问题是什么,请参考这篇有关将dll添加到Mono的文章:http://www.mono-project.com/DllNotFoundException - Mohamad Alhamoud
@Alasdair,使用指令并不等同于引用 DLL。使用指令告诉编译器在该命名空间中查找类型。而引用则告诉 MSBuild 通知编译器在编译过程中使用/包含特定的 DLL。 - Rune FS

2

Visual Studio Code和Mono/.NetCore

如果你想在Linux上运行/编译/调试C#,现在可以使用:

如果你想要在Linux和Windows上使用完全相同的API,可以使用.Net Core

在命令行中进行编译:

dotnet build <solution/project> 

或者如果您在文件夹中只有一个项目

dotnet build

然后

dotnet run

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接