单声道项目中使用的所有依赖关系是否需要使用单声道进行编译

问题描述:

假设我在Windows(Visual Studio 2008)下启动了一个C#项目,并且想切换到Mono。我是否必须重新编译我项目使用的所有依赖关系,例如NHibernate和每个外部依赖关系?单声道项目中使用的所有依赖关系是否需要使用单声道进行编译

注意1:我问这个问题的原因是我在Ubuntu 9.10上使用MonoDevelop构建了一个项目,并且所有内容都像是魅力一样,但是当我尝试调试运行时,一些使用NUnit编写的测试都只是停了下来。我必须取消正在运行的测试才能恢复MonoDevelop,并且没有可用于查找问题的明确堆栈跟踪或提示。所以我虽然也许我需要在Mono/Linux下编译NHibernate(和其他依赖项)。

不,您不需要重新编译您在使用Mono编译器编译的代码中引用的DLL。

但是,如果您的用户在Mono而不是Microsoft.NET框架下执行该应用程序,并且该DLL包含Mono框架不支持的调用,则它们将遇到问题。

有一个Mono migration tool可以分析您的DLL,以查看它们是否包含Mono用户不支持的任何调用。

同样,使用Mono编译器编译的DLL可以被使用Microsoft编译器编译的代码引用。

查看Mono FAQ的Is Mono Binary Compatible with Windows?部分。

答案是mono是二进制兼容的,所以不需要重新编译。

正如其他人所说,它们是二进制兼容的。

作为一个例子,我最近需要使用Mono.Cecil.dll来避免我遇到的一些基于AppDomain反射的痛苦,并且能够获取由Mono编译器构建的最新版本,并且它运行在我的。 NET 3.5运行时没有问题。

当然,如果您打算在Linux或Windows以外的任何平台上运行,则必须依赖那些正确编写的程序集,因此使用Environment.NewLine,Path.Combine等代替Windows特定代码。