单编译二进制文件无法在Windows上运行除非使用msbuild

问题描述

在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/中的路径(或框架设置定义的任何路径)。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...