问题描述
在Windows上使用Mono csc编译器创建的二进制文件时遇到一些麻烦。这是Framework 4.0的基本CLI项目,带有一些内部程序集。以前,我们是使用xbuild构建此工具的,结果在任何地方都可用。现在无法使用xbuild(出于内部策略原因),因此我添加了一个脚本,该脚本直接调用csc命令。 .exe仍然可以在Mono中运行,但在Windows上我可以得到:
未找到方法:“ System.String System.String.TrimEnd(Char)”。 在...
这令人惊讶。当我调查代码中的函数调用时,就像:
subDirectory.Replace('/',Path.DirectorySeparatorChar).TrimEnd(Path.DirectorySeparatorChar)
因此,该签名在.NET中不可用,但.TrimEnd(params Char[])
是可用的。并且编译器通常应在单个参数和params数组之间进行转换。
我的csc命令行如下:
csc / debug:full / debug:portable / optimize- / define:“ DEBUG; TRACE” / langversion:最新.v4.0.AssemblyAttribute.cs /out:bin/Debug/myproject.exe / target:exe * .cs / .cs /r:bin/Debug/some_custom_depencency.dll /r:bin/Debug/some_other_custom_dependency.dll… / nostdlib /r:System.dll /r:System.Xml.Linq.dll /r:System.Data.DataSetExtensions.dll /r:System.Data.dll /r:System.Xml.dll /r:System.Core.dll /r:mscorlib.dll / warn:4
仅使用shell的通配符扩展,它与msbuild差不多。 .v4.0.AssemblyAttribute.cs文件是我从xbuild临时文件(定义.NET Framework版本的文件)中抓取的文件。
我在dotPeek中检查了旧的和新的exe(msbuild和自定义调用),除签名外,其他所有内容看起来都相同。文件可通过Mono本身运行。
我现在的想法已经用光了,有人可以建议尝试或更改的东西,还是可以立即知道原因?
解决方法
发现了问题,这是正确的。 msbuild / xbuild使用框架程序集的绝对路径,但我的电话没有。我以为它会考虑来自AssemblyAttribute的信息,但显然不会,单链接器会很高兴地使用其默认框架,并且不会在构建时报告不匹配。
解决方案:将/ r:...路径更改为/usr/lib/mono/4.0-api/中的路径(或框架设置定义的任何路径)。