2014-10-12 43 views
1

我正在使用protobuf-net来序列化我的数据。在Windows下一切正常,我使用Mono在Linux下运行示例项目,但看起来并不简单。protobuf-net + Mono + Linux

我收到以下错误:

Missing method Skip in assembly /home/***/Debug/Di3.dll, type System.Linq.Enumerable Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies.

唯一的例外是在下面的行抛出:

var instance = new ToSerializeClass(); 

和类中定义为:

[ProtoContract] 
public class ToSerializeClass 
{ 
    internal ToSerializeClass() 
    {// it seems that the protobuf net needs this constructor. 
    } 

    [ProtoMember(1)] 
    internal int omega { set; get; } 

    [ProtoMember(2)] 
    internal List<Lambda> lambda { set; get; } 
} 

我复制调试/将文件夹部署到linux,用o替换protobuf-net.dllprotobuf-net.xml nes已发布为Mono,并使用Mono致电我的程序。

我在这里错过了什么观点吗?

+0

我可能是错的,但我很确定protobuf-net *不使用* LINQ。有一个3.0版本(WCF支持),但我从来没有发布引用LINQ(3.5,不包括LinqBridge)的版本,因为我不需要这些工具。你确定问题出在你认为的地方吗?我也很困惑你为什么在构建之后交换DLL。这听起来彻底坏主意。你想在那里做什么? – 2014-10-12 15:01:00

+0

@MarcGravell我很确定上述的例外情况。关于你的最后一点,我也为Linux构建了适当的protobuf-net,但仍然收到同样的错误。 – Hamed 2014-10-12 15:58:10

+0

你做了什么你的单声道构建?你使用MonoDevelop/Xamarin吗?您是否使用单声道命令提示符/ shell中的mcs/gmcs?还是你只是在Visual Studio中构建? – 2014-10-12 16:35:38

回答

1

这听起来像是这里的主要问题是您的项目设置和构建过程。 Visual Studio,如果框没有,则不会以单声道为目标。如果你坚持使用低级的.net版本(2.0,3.0等),那么通常只能工作,但是在更高版本的情况下这会变得更加脆弱。

这里更典型的做法是使用不同的项目/版本来定位单声道。这可能是MonoDevelop,Xamarin或命令行中的mcs。使用这些工具,您应该能够正确编译您的项目,目标是单声道和可用的框架版本。

特别是,请注意,protobuf-net在所有都不使用LINQ ,并且不引用System.Core - 因此加载异常与protobuf-net没有任何关系。单声道运行时很可能根本无法识别您为测试项目配置的核心引用。

+0

是的,你是对的,它使用Xamarin构建。我错过了这一点;虽然它看起来像我之前的所有项目都是在Linux下运行的,只是通过一些魔法;-) 10x – Hamed 2014-10-12 18:44:32

+0

@Hamed你以前的项目可能是针对低级别的.net版本吗?或者不使用LINQ? – 2014-10-12 20:44:05

+0

应该使用csc.exe或mcs.exe的编译器无关紧要。它应该一样。如果没有,你应该报告错误...顺便说一句... Xamarin.Android在Windows上使用csc.exe来编译所有项目,所以csc.exe输出应该是非常兼容Mono ... – 2014-10-12 21:38:24