我在Mono上运行使用TopShelf构建的.NET应用程序服务时遇到问题。
开发设置为: Win 8.1,VS 2015,.NET 4.5.2作为目标框架
CI设置: Win Server 2012,TeamCity 9.1.6,服务器和构建代理都在同一台机器上运行
执行(测试服务器)设置: CentOS 6 x86_64,Mono 4.2.2
所以我实现了一个作为控制台应用程序和后台服务(使用TopShelf)运行的应用程序,并在本地成功调试和测试。
我已经在构建代理上构建应用程序的方式设置了CI服务器,并将内部(发布配置)中包含多个dll和.exe runner文件的文件夹作为输出生成。最后,CI将此文件夹发布到远程CentOS服务器。
当我通过ssh连接到CentOS服务器并尝试使用mono myapp.exe
命令运行它时,出现错误:
# mono myapp.exe
Configuration Result:
[Success] Name myapp
[Success] DisplayName myapp
[Success] Description myapp
[Success] ServiceName myapp
Topshelf v3.3.154.0, .NET Framework v4.0.30319.17020
[DEBUG][2/4/2016 7:42:57 PM][Thread 0001][EventStream] StandardOutLogger started
[INFO][2/4/2016 7:42:57 PM][Thread 0006][[akka://AkkaGrid/system/log1-NLogLogger]] NLogLogger started
[DEBUG][2/4/2016 7:42:57 PM][Thread 0001][EventStream(AkkaGrid)] Logger log1-NLogLogger [NLogLogger] started
[DEBUG][2/4/2016 7:42:57 PM][Thread 0001][EventStream(AkkaGrid)] StandardOutLogger being removed
2016-02-04 22:42:57.4509 DEBUG Start
2016-02-04 22:42:57.4538 DEBUG Logger log1-NLogLogger [NLogLogger] started
2016-02-04 22:42:57.4714 DEBUG StandardOutLogger being removed
2016-02-04 22:42:57.4714 DEBUG Default Loggers started
The myapp service is now running, press Control+C to exit.
2016-02-04 22:42:57.5075 ERROR Error while creating actor instance of type MyApp.Actors.Supervisor with 0 args: ()EXCEPTION OCCURRED:Akka.Actor.ActorInitializationException Exception during creation Void Create(System.Exception)
TypeLoadException Error while creating actor instance of type MyApp.Actors.Supervisor with 0 args: () Akka.Actor.ActorBase NewActor()
TargetInvocationException Exception has been thrown by the target of an invocation. System.Object InternalInvoke(System.Object, System.Object[])
MissingMethodException Method 'Array.Empty' not found.
2016-02-04 22:42:57.5216 INFO Message FetchEntityMessage from NoSender to akka://AkkaGrid/user/$b was not delivered. 1 dead letters encountered.
忽略了内部也存在Akka.net和NLogger的事实,核心问题似乎就在这一行:
MissingMethodException Method 'Array.Empty' not found.
因此,为了测试我的代码与Mono本身的兼容性,我手动将应用程序文件夹(Release)从我的本地机器(在VS2015 / MsBuild之后)复制到CentOS服务器并运行{{1}再次命令。 这样执行成功并且在输出中没有产生错误。
为确保问题与复制过程无关,我已连接到Win2012服务器(运行CI),转到构建代理的工作目录并执行{{1作为一个简单的Windows控制台应用程序。它运行成功。然后我通过mono myapp.exe
的{{1}}命令手动将应用程序文件夹复制到CentOS服务器,并且...得到了与上面相同的问题。
要提供一些额外的详细信息,构建日志如下:
myapp.exe
所以我可以看到TeamCity没有直接运行MSBuild,而是一些MsBuildBootstrap应用程序。 MSBuild Tools 2015在构建步骤设置中设置。那么......所有的细节,任何帮助表示赞赏:)
答案 0 :(得分:1)
MissingMethodException Method' Array.Empty'没找到。
此方法是.NET 4.6中的新方法,如documentation中所述。
问题是Mono 4.2.2与此版本的.NET不兼容。
我查看了这些来源,它看起来是主分支already includes this中的Mono。但是,引入它的提交尚未标记为存在于任何标记或分支中。这意味着您必须等到Mono 4.3或4.4发布,或者自己编译Mono,或者尝试寻找可以使用的每周/每晚构建。
一个更容易修复的方法可能是尝试依赖不那么尖端的二进制文件(即使用框架版本3.5或4.0进行编译)。