2014-10-12 2 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, замените protobuf-net.dll и protobuf-net.xml на o nes опубликовано для Mono и вызовите мою программу, используя Mono.

У меня отсутствуют какие-либо баллы здесь?

+0

Я мог ошибаться, но я уверен, что protobuf-net * не использует * LINQ. Существует сборка 3.0 (поддержка WCF), но я никогда не выпускал версию, которая ссылается на LINQ (3.5, не включая LinqBridge), потому что мне здесь не нужны эти инструменты. Вы уверены, что проблема в том, где вы думаете? Я также смущен, почему вы меняете библиотеки DLL после сборки. Это звучит неплохо. Что вы там делаете? –

+0

@MarcGravell Я почти уверен в вышеупомянутой строке исключения. Что касается вашего последнего пункта; Я также сделал сборку с надлежащей protobuf-net для Linux, но все же я получаю ту же ошибку. – Hamed

+0

Что именно вы делали для своего моностроения? Вы использовали MonoDevelop/Xamarin? Вы использовали mcs/gmcs из командной строки/оболочки mono? Или вы просто создали Visual Studio? –

ответ

1

Похоже, что основная проблема заключается в том, что вы создаете и настраиваете проект. Visual Studio, если поле не настроено на моно. Если вы придерживаетесь нисходящих версий .net (2.0, 3.0 и т. Д.), То обычно просто работает, но это становится более громким с более высокими версиями.

Более типичной задачей здесь является использование другого проекта/сборки для ориентации моно. Это может быть MonoDevelop, Xamarin или mcs в командной строке. С помощью этих инструментов вы должны иметь возможность правильно скомпилировать ваш проект, ориентированный на моно и доступные версии фреймворка.

В частности, обратите внимание, что protobuf-net не использует LINQ вообще и не ссылается на System.Core - так что исключение загрузки не имеет ничего общего с protobuf-net. Скорее всего, mono runtime просто не распознает основные ссылки, которые вы настроили для своего тестового проекта.

+0

да, вы правы, он работает с использованием сборки Xamarin. Мне не хватало этой точки; хотя кажется, что все мои предыдущие проекты работали под Linux только по какой-то магии ;-) 10x – Hamed

+0

@Hamed Ваши предыдущие проекты могли быть нацелены на версии .net-версии. Или не использовать LINQ? –

+0

Не имеет значения, какой компилятор вы используете csc.exe или mcs.exe. Он должен работать так же. Если нет, вам следует сообщить об ошибке ... Btw ... Xamarin.Android в Windows использует csc.exe для компиляции всех проектов, поэтому вывод csc.exe должен быть очень совместим с Mono ... –

Смежные вопросы